|
Schön und praktisch ist die AutoSize-Eigenschaft des
Label-Steuerelements, die dafür sorgt, dass es seine Größe immer
dem darin enthaltenen Text anpasst. Auch schön und arbeitsparend
ist, dass das Label die notwendigen Zeilenumbrüche selbst
ermittelt, wenn Sie es mit einem überlangen Text füttern und die
Eigenschaft WordWrap gleich True setzen. Weniger schön ist dagegen,
dass es seine Breite willkürlich ändert, wenn Sie diese vorgeben
und anschließend mit einem AutoSize = True für die Anpassung der
Höhe an die tatsächlich benötigte Zeilenzahl sorgen wollen. Das
Label wird immer um ein paar Buchstabenbreiten breiter werden, falls
Sie nicht zufällig einen ihm genehmen Wert wählen. Das Einpassen
in einen vorgegebenen Raum, etwa in eine PictureBox, wird so zum
Glücksspiel - das jedes Mal aufs Neue beginnt, wenn Sie den Raum
oder auch nur die Schriftart, -größe usw. des Labels ändern
wollen.
Es führt kein Weg daran vorbei, ausgehend von der gewünschten
Breite diese so lange zu vermindern, bis das Label sich damit
einverstanden erklärt und sich nicht mehr eigenwillig verbreitert.
Dazu verringern Sie Schritt für Schritt in einer Do...Loop-Schleife
eine Vergleichsbreite ausgehend von der Zielbreite, setzen jeweils
die AutoSize-Eigenschaft des Labels auf False, weisen ihm die
jeweils neue Vergleichsbreite zu und setzen AutoSize wieder auf True
zurück. Erst wenn die Breite des Labels nicht mehr von alleine die
gewünschte maximale Breite überspringt, wird die Schleife
verlassen bzw. nicht weiter durchlaufen. Sie wird ebenfalls
verlassen, wenn die Vergleichsbreite gleich oder kleiner als Null
geworden ist, damit die Schleife nicht endlos läuft oder in einen
Laufzeitfehler bei der Zuweisung einer negativen Breite mündet -
dieser letztmögliche Ausstieg aus der Schleife bedeutet allerdings
auch einen Fehlschlag des Verfahrens. Damit dieses
Versuch-und-Irrtum-Verfahren nicht in störendes Flackern ausartet,
machen Sie das Label am besten vorher unsichtbar und hinterher
wieder sichtbar.
Dim nLabelWidth As Single
Dim nPicScaleWidth As Single
With picLabelBack
nLabelWidth = .ScaleWidth
nPicScaleWidth = nLabelWidth
With lbl2Size
.Visible = False
.WordWrap = True
Do While .Width > nPicScaleWidth
nLabelWidth = nLabelWidth - Screen.TwipsPerPixelX
.AutoSize = False
.Width = nLabelWidth
.AutoSize = True
If nWidth <= 0 Then
Exit Do
End If
Loop
Nun können Sie das Label auch noch, falls gewünscht, innerhalb
der Zielbreite exakt zentrieren:
If chkCentered.Value Then
.Left = (nPicScaleWidth - .Width) \ 2
Else
.Left = 0
End If
.Visible = True
End With
Und so erfahren Sie zum Schluss, zu wie vielen Zeilen der
automatische Wortumbruch nun geführt hat:
Dim nOldPicFont As StdFont
Set nOldPicFont = .Font
Set .Font = lbl2Size.Font
lblLinesCount.Caption = lbl2Size.Height \ .TextHeight("A")
Set .Font = nOldPicFont
End With

|