|
Mit dem Label-Steuerelement ist es kein Problem, Text horizontal
ausgerichtet darzustellen. Auch die Anzeige mehrzeiliger Texte ist
möglich. Eine vertikale Ausrichtung ist jedoch leider nicht
möglich. Somit bleibt es Ihnen selbst überlassen, vertikal
ausgerichteten Text in einer PictureBox, in einem UserControl, auf
einer PropertyPage, in einem UserDocument oder auf einem Form
auszugeben.
Die Hilfs-Prozedur PrintAligned übernimmt diese Aufgabe. Sie
können ihr jedes Objekt übergeben, das die Eigenschaften bzw.
Methoden ScaleWidth,
ScaleHeight, ScaleTop,
TextWidth,
TextHeight,
CurrentX
und CurrentY, sowie die Cls-
und die Print-Methode
anbietet.
Zwar gehört neben den oben angeführten Objekten auch das
Printer-Objekt dazu. Da jedoch bei der Prozedur PrintAligned die
Ausgabe über den gesamten "sichtbaren" Bereich erfolgt,
also den Bereich, der von den Scale...-Eigenschaften
beschrieben wird, wird ihre Verwendung wenig Sinn machen. Denn
gegebenenfalls darüber hinausragende Textteile werden abgeschnitten
bzw. erst gar nicht dargestellt, ohne dass Sie Informationen über
die entfallenden Teile bekämen oder die Kontrolle darüber hätten.
Die dafür notwendigen Mechanismen wären weitaus aufwändiger. Bei
der Ausgabe in einem Objekt auf dem Bildschirm ist es allerdings
auch nicht schön, wenn Texte abgeschnitten werden. Aber das dient
in diesem Fall der Stabilität und Universalität der Prozedur und
zugleich der Optimierung durch die Vermeidung unnötiger
Ausgabeversuche ins Nichts hinein. Natürlich ist es am besten, Sie
kontrollieren vorher, was im sichtbaren Bereich eines Objektes
ausgegeben werden kann...
Sie übergeben der Prozedur PrintAligned das betreffende
Ausgabe-Objekt und den auszugebenden Text als String, der
gegebenenfalls Zeilenumbrüche (Zeichenfolge vbCrLf) enthalten kann,
wenn der Text mehrzeilig dargestellt soll. Sollte ein Text nur
einzeilig ausgegeben werden, sollten sie bereits vorher dafür
sorgen, dass dieser keine Zeilenumbrüche mehr enthält.
Optional übergeben sie weiterhin einen Konstantwert aus der
Enumeration pftAlignmentConstants zur Angabe der Ausrichtung -
voreingestellt ist pftLetTop. Sie können ebenfalls festlegen, ob
bei den einzelnen Zeilen eventuell vorhandene führende oder
abschließende Leerzeichen vor der Ausgabe entfernt werden sollen.
Public Enum pftAlignmentConstants
pftLeftTop
pftCenterTop
pftRightTop
pftLeftMiddle
pftCenterMiddle
pftRightMiddle
pftLeftBottom
pftCenterBottom
pftRightBottom
End Enum
Public Sub PrintAligned(Obj As Object, Text As String, _
Optional ByVal Alignment As _
pftAlignmentConstants = pftLeftTop, _
Optional ByVal TrimLines As Boolean)
Dim nLines As Variant
Dim nLine As Long
Dim nScaleWidth As Single
Dim nTextHeight As Single
Dim nPrintTop As Single
Dim nPrintBottom As Single
Dim nTop As Single
Dim nFirst As Long
If Len(Text) = 0 Then
Exit Sub
End If
nLines = Split(Text, vbCrLf)
If TrimLines Then
For nLine = 0 To UBound(nLines)
nLines(nLine) = Trim$(nLines(nLine))
Next
End If
With Obj
nScaleWidth = .ScaleWidth
nTextHeight = .TextHeight(nLines(0))
nPrintTop = .ScaleTop - nTextHeight
nPrintBottom = .ScaleTop + .ScaleHeight + nTextHeight
.Cls
Select Case Alignment
Case pftLeftTop
For nLine = 0 To UBound(nLines)
Obj.Print nLines(nLine)
If .CurrentY > nPrintBottom Then
Exit For
End If
Next 'nLine
Case pftCenterTop
For nLine = 0 To UBound(nLines)
.CurrentX = (nScaleWidth - _
.TextWidth(nLines(nLine))) \ 2
Obj.Print nLines(nLine)
If .CurrentY > nPrintBottom Then
Exit For
End If
Next 'nLine
Case pftRightTop
For nLine = 0 To UBound(nLines)
.CurrentX = nScaleWidth - .TextWidth(nLines(nLine))
Obj.Print nLines(nLine)
If .CurrentY > nPrintBottom Then
Exit For
End If
Next 'nLine
Case pftLeftMiddle
nTop = (.ScaleHeight - (nTextHeight * _
(UBound(nLines) + 1))) \ 2
Do While nTop < nPrintTop
nTop = nTop + nTextHeight
nFirst = nFirst + 1
Loop
.CurrentY = nTop
For nLine = nFirst To UBound(nLines)
Obj.Print nLines(nLine)
If .CurrentY > nPrintBottom Then
Exit For
End If
Next 'nLine
Case pftCenterMiddle
nTop = (.ScaleHeight - (nTextHeight * _
(UBound(nLines) + 1))) \ 2
Do While nTop < nPrintTop
nTop = nTop + nTextHeight
nFirst = nFirst + 1
Loop
.CurrentY = nTop
For nLine = nFirst To UBound(nLines)
.CurrentX = (nScaleWidth - _
.TextWidth(nLines(nLine))) \ 2
Obj.Print nLines(nLine)
If .CurrentY > nPrintBottom Then
Exit For
End If
Next 'nLine
Case pftRightMiddle
nTop = (.ScaleHeight - (nTextHeight * _
(UBound(nLines) + 1))) \ 2
Do While nTop < nPrintTop
nTop = nTop + nTextHeight
nFirst = nFirst + 1
Loop
.CurrentY = nTop
For nLine = nFirst To UBound(nLines)
.CurrentX = nScaleWidth - .TextWidth(nLines(nLine))
Obj.Print nLines(nLine)
If .CurrentY > nPrintBottom Then
Exit For
End If
Next 'nLine
Case pftLeftBottom
.CurrentY = .ScaleTop + .ScaleHeight - nTextHeight
For nLine = UBound(nLines) To 0 Step -1
Obj.Print nLines(nLine)
.CurrentY = .CurrentY - 2 * nTextHeight
If .CurrentY < nPrintTop Then
Exit For
End If
Next 'nLine
Case pftCenterBottom
.CurrentY = .ScaleTop + .ScaleHeight - nTextHeight
For nLine = UBound(nLines) To 0 Step -1
.CurrentX = (nScaleWidth - _
.TextWidth(nLines(nLine))) \ 2
Obj.Print nLines(nLine)
.CurrentY = .CurrentY - 2 * nTextHeight
If .CurrentY < nPrintTop Then
Exit For
End If
Next 'nLine
Case pftRightBottom
.CurrentY = .ScaleTop + .ScaleHeight - nTextHeight
For nLine = UBound(nLines) To 0 Step -1
.CurrentX = nScaleWidth - .TextWidth(nLines(nLine))
Obj.Print nLines(nLine)
.CurrentY = .CurrentY - 2 * nTextHeight
If .CurrentY < nPrintTop Then
Exit For
End If
Next 'nLine
End Select
End With
End Sub
In Visual Basic 6 steht die benötigte Funktion Split
bereits zur Verfügung. Für Visual Basic 5 verwenden
Sie die in Teile-Haberschaft
vorgestellte Funktion Split.
|