|
Sie können zwar ein Label-Steuerelement mit einem Rahmen
versehen, indem Sie dessen BorderStyle-Eigenschaft auf 1
setzen. Aber dann erhalten Sie nur einen relativ "dicken"
Rahmen, der nicht sonderlich elegant aussieht. Eleganter sieht ein
Rahmen um einen Text aus, wie Sie ihn etwa in Statuszeilen sehen.
Mittel der API-Funktion DrawStatusText
aus der ComCtl32.DLL können Sie solche
Text-Anzeigeflächen einschließlich des Textes selbst zeichnen. Und
im Gegensatz zum Label-Steuerelement kann der Rahmen hierbei auch
erhaben sein. Ein weiterer Vorteil ist, dass der Text ohne weitere
Berechnungen immer an der gleichen Position erscheint, wenn Sie
zwischen flacher, versenkter und erhabener Darstellung wechseln
möchten.
Die Prozedur DrawStatusRect kapselt den Aufruf der API-Funktion.
Sie übergeben ihr das Objekt, in dem gezeichnet werden soll. Es
muss mindestens die Eigenschaften hDC und ScaleMode sowie die
Methoden ScaleX und ScaleY bieten. Lassen Sie die Angabe von Breite
oder Höhe in den optionalen Parametern Width oder Height weg,
werden die Höhe und die Breite unter Zugabe eines kleinen Freiraums
automatisch berechnet. Dazu muss das Objekt zusätzlich über die
Methoden TextWidth und TextHeight verfügen. Die Visual
Basic-Objekte Form, PictureBox, UserControl, PropertyPage und
UserDocument erfüllen alle diese Voraussetzungen. Die Umrechnung in
Pixels für den Aufruf der API-Funktion erfolgt ebenfalls
automatisch - Sie können die ScaleMode-Eigenschaft beliebig
einstellen und die Positions- und Größenangaben in dieser
Maßeinheit übergeben.
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Sub DrawStatusTextAPI Lib "comctl32.dll" _
Alias "DrawStatusTextA" (ByVal hDC As Long, DrawRect As RECT, _
ByVal Text As String, ByVal Flags As Long)
Private Declare Sub InflateRect Lib "user32" _
(lpRect As RECT, ByVal x As Long, ByVal y As Long)
Public Enum dstModeConstants
dstSunken
dstFlat = &H100
dstRaised = &H200
End Enum
Public Sub DrawStatusText(Obj As Object, Text As String, _
ByVal Left As Single, ByVal Top As Single, _
Optional ByVal Width As Single, _
Optional ByVal Height As Single, _
Optional Mode As dstModeConstants, _
Optional ByVal EraseRect As Boolean)
Dim nWidth As Single
Dim nHeight As Single
Dim nRect As RECT
Dim nRect2 As RECT
With Obj
If Width <= 0 Then
nWidth = .TextWidth(Text) + .ScaleX(8, .ScaleMode, vbPixels)
Else
nWidth = Width
End If
If Height <= 0 Then
nHeight = .TextHeight(Text) + .ScaleY(5, .ScaleMode, vbPixels)
Else
nHeight = Height
End If
nRect.Left = .ScaleX(Left, .ScaleMode, vbPixels)
nRect.Top = .ScaleX(Top, .ScaleMode, vbPixels)
nRect.Right = nRect.Left + .ScaleX(nWidth, .ScaleMode, vbPixels)
nRect.Bottom = nRect.Top + .ScaleY(nHeight, .ScaleMode, vbPixels)
If EraseRect Then
If Mode = dstFlat Then
LSet nRect2 = nRect
InflateRect nRect2, 2, 2
DrawStatusTextAPI .hDC, nRect2, "", dstFlat
End If
End If
DrawStatusTextAPI .hDC, nRect, Text, Mode
End With
End Sub
Im letzten optionalen Parameter EraseRect geben Sie an, ob vor
dem Zeichnen mit der Einstellung dstFlat ein eventuell bereits an
der gleichen Stelle vorhandener Rahmen gelöscht werden soll. Denn
in dieser Einstellung wird nur eine um rundherum 1 Pixel
kleinere Fläche gezeichnet. Dahinter steckt wohl ursprünglich die
Absicht, dass Sie den Text wechseln können, ohne dass der Rahmen
jedes Mal neugezeichnet werden muss.
Natürlich können Sie mit dieser Funktion auch ohne weiteres
leere versenkte oder erhabene Rahmen zeichnen, wenn Sie einen leeren
String übergeben.
|