|
Grundsätzlich ist es eine einfache Aufgabe, die Größe eines UserControls automatisch an eine von seinem Inhalt vorgegebene Größe anzupassen, so dass sie weder zur Laufzeit noch zur Entwicklungszeit geändert werden kann. Im Resize-Ereignis des UserControls werden über einen Aufruf der Size-Methode des UserControls die gewünschte Breite und Höhe gesetzt. Die Maßeinheit für Breite und Höhe ist für die Size-Methode immer TWIPS, unabhängig von der Maßeinheit (ScaleMode) des Containers, auf dem das UserControl platziert ist.
Private Sub UserControl_Resize()
UserControl.Size Breite, Höhe
End Sub
Beachten Sie, dass das Resize-Ereignis erneut ausgelöst wird, wenn hier tatsächlich die Größe geändert wurde. Stimmten Höhe und Breite des UserControls bereits mit den Werten von Breite und Höhe überein, wird das Ereignis nicht ausgelöst. Für den Fall des erneuten Auslösens ist es sinnvoll zu verhindern, dass weiterer gegebenenfalls vorhandener Code im Resize-Ereignis nicht erneut ausgeführt wird. Dies verhindern Sie mit Hilfe einer statischen Sperr-Variablen in diesem Ereignis (siehe: "Aller guten Dinge ist eins").
Private Sub UserControl_Resize()
Static sInProc
If sInProc Then
Exit Sub
Else
sInProc = True
End If
' ... weiterer Code ...
UserControl.Size Breite, Höhe
' ... weiterer Code ...
sInProc = False
End Sub
Falls das UserControl einen Rahmen hat, also die Eigenschaft BorderStyle auf "1 - Fest einfach" gesetzt ist, müssen Sie zu den gewünschten Abmessungen noch die Rahmenstärke hinzufügen, damit die Abmessungen des sichtbare Innenbereichs auch tatsächlich mit den gewünschten Maßen übereinstimmen.
Die vertikale und die horizontale Rahmenstärke ermitteln Sie, indem Sie vor der Größenänderung jeweils die noch aktuelle Innenbreite (ScaleWidth) und Innenhöhe (ScaleHeight) des UserControls von den noch aktuellen Außenmaßen subtrahieren. Wenn die Maßeinheit de UserControls (ScaleMode) unverändert auf TWIPS gesetzt ist, können Sie die ScaleWidth- und ScaleHeight-Werte direkt von Width und Height des UserControls subtrahieren. Ist jedoch eine andere Maßeinheit eingestellt, müssen Sie die Werte von ScaleWidth und ScaleHeight zunächst mittels der ScaleX- bzw der ScaleY-Methode in TWIPS umrechnen.
Private Sub UserControl_Resize()
Dim nBorderWidth As Single
Dim nBorderHeight As Single
Static sInProc
If sInProc Then
Exit Sub
Else
sInProc = True
End If
With UserControl
If .BorderStyle = 1 Then
nBorderWidth = .Width - .ScaleX(.ScaleWidth, .ScaleMode, _
vbTwips)
nBorderHeight = .Height - .ScaleY(.ScaleHeight, .ScaleMode, _
vbTwips)
End If
.Size Breite + nBorderWidth, Höhe + nBorderHeight
End With
sInProc = False
End Sub
Sollen sich beispielsweise die Breite und die Höhe des UserControls nach einem auf diesem platzierten Steuerelement richten, etwa nach einem Bild-Element (Image-Steuerelement), und ist als ScaleMode nicht TWIPS gewählt, sind auch die Maße dieses Steuerelements in TWIPS umzurechnen. Dieses Steuerelement ist natürlich zuvor in die linke obere Ecke des UserControls zu verschieben.
Image1.Move 0, 0
.Size .ScaleX(Image1.Width, .ScaleMode, vbTwips) -
+ nBorderWidth, .ScaleY(Image1.Height, .ScaleMode, vbTwips) _
+ nBorderHeight
Diese Umrechnung ist immer notwendig, wenn die Maßangaben für Breite und Höhe in einer anderen Maßeinheit als TWIPS vorliegen.
Je nach Verwendungszweck des UserControls ist es vielleicht sinnvoll, diese selbsttätige Anpassung beliebig ein- und ausschalten zu können. Dazu verleihen Sie Ihrem Steuerelement eine eigene Eigenschaft wie etwa AutoSize, wie Sie von der PictureBox her kennen sollten. Im Resize-Ereignis des UserControls muss nun noch der Wert dieser Eigenschaft geprüft werden.
Private Sub UserControl_Resize()
Dim nBorderWidth As Single
Dim nBorderHeight As Single
Static sInProc
If sInProc Then
Exit Sub
Else
sInProc = True
End If
If pAutoSize Then
With UserControl
If .BorderStyle = 1 Then
nBorderWidth = .Width - .ScaleX(.ScaleWidth, .ScaleMode, _
vbTwips)
nBorderHeight = .Height - .ScaleY(.ScaleHeight, _
.ScaleMode, vbTwips)
End If
.Size Breite + nBorderWidth, Höhe + nBorderHeight
End With
End If
sInProc = False
End Sub
Die Eigenschaft AutoSize können sie wie folgt verwalten:
Private pAutoSize As Boolean
Public Property Get AutoSize() As Boolean
AutoSize = pAutoSize
End Property
Public Property Let AutoSize(New_AutoSize As Boolean)
If pAutoSize <> New_AutoSize Then
pAutoSize = New_AutoSize
UserControl_Resize
End If
PropertyChanged "AutoSize"
End Property
' ...
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
pAutoSize = PropBag.ReadProperty("AutoSize", False)
' ...
End Sub
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
PropBag.WriteProperty "AutoSize", pAutoSize, False
' ...
End Sub
|