|
Die Align-Eigenschaft bei Steuerelementen wie etwa der PictureBox sorgt dafür, dass sich das Steuerelement automatisch an einer Kante eines Forms oder eines anderen Containers ausrichtet. Bei horizontaler Ausrichtung (vbAlignTop oder vbAlignBottom) passt sich die Breite des Steuerelements automatisch der Innenbreite (ScaleWidth) des Containers an. Bei vertikaler Ausrichtung (vbAlignLeft oder vbAlignRight) passt sich die Höhe automatisch der Innenhöhe an, wobei diese Innenhöhe bereits durch horizontal "alignte" Steuerelemente reduziert sein kann.
Nervt es Sie beim Wechsel von einer horizontalen zu einer vertikalen Ausrichtung (oder umgekehrt) auch immer wieder, dass das Steuerelement danach die gesamte verbleibende Fläche des Containers belegt? Zumindest bei selbstentwickelten Steuerelementen auf der Basis eines UserControls können Sie das ändern und dafür sorgen, dass zunächst die vorherige Höhe zur neuen Breite bzw. die vorherige Breite zur neuen Höhe wird.
Dazu halten Sie im Resize-Ereignis des UserControls nach jeder Größenänderung den letzten Align-Zustand des Extender-Objekts (die Align-Eigenschaft gehört, vereinfacht gesagt, zu den VB-spezifischen Eigenschaften eines Steuerelements, die dem Extender-Objekt zugeordnet sind) sowie die breite und die Höhe in statischen Variablen fest. Bei einem Wechsel von horizontaler zu vertikaler Ausrichtung setzen Sie einfach die Höhe des Extender-Objekts auf die gespeicherte Breite bzw. umgekehrt die Breite auf die gespeicherte Breite. Da dies ja wieder eine Änderung der Größe bedeutet, wird erneut das Resize-Ereignis ausgelöst. Damit keine Endlosschleife entstehen kann, sorgen Sie mit einer statischen Sperrvariablen dafür, dass der eigentliche Code des Resize-Ereignisses nicht erneut bearbeitet werden kann, bevor eine Bearbeitung abgeschlossen ist (siehe "Aller guten Dinge ist eins"khwinproc.htm).
Private Sub UserControl_Resize()
Static sLastHeight As Single
Static sLastWidth As Single
Static sLastAlign As AlignConstants
Static sInProc As Boolean
If sInProc Then
Exit Sub
Else
sInProc = True
End If
With Extender
Select Case .Align
Case sLastAlign
Case vbAlignNone
Case vbAlignTop, vbAlignBottom
Select Case sLastAlign
Case vbAlignLeft, vbAlignRight
.Height = sLastWidth
End Select
Case vbAlignLeft, vbAlignRight
Select Case sLastAlign
Case vbAlignTop, vbAlignBottom
.Width = sLastHeight
End Select
End Select
sLastHeight = .Height
sLastWidth = .Width
sLastAlign = .Align
End With
sInProc = False
End Sub
|