|
Welche Absicht auch immer dahinter gestanden haben mag - die Beschriftung einer gesperrten (Enabled = False) CheckBox oder eines gesperrten Option-Buttons sieht anders aus als ein gesperrtes Label. Der Text in letzterem erscheint schlicht in der "Ausgrau"-Systemfarbe (vbGrayText), während die Beschriftung der CheckBox und des OptionButtons ein wenig eingeprägt erscheinen: Die Beschriftung erscheint dahinter noch einmal, um ein Pixel nach rechts und unten versetzt und in der 3D-Systemfarbe "Schaltflächenmarkierung" (vb3DHighlight).
Um ein Label, das etwa als Erweiterung einer CheckBox-Beschriftung verwendet werden soll, mit der gleichen Optik in gesperrtem Zustand aufwarten zu lassen, brauchen Sie lediglich ein zweites Label, das im nicht gesperrten Zustand unsichtbar ist. Zur Darstellung des gesperrten Zustandes setzen Sie dieses "Schatten-Label" hinter das eigentliche Label, wie gesagt um ein Pixel nach rechts und unten verschoben. Weisen Sie ihm noch (sicherheitshalber) den gleichen Text zu, während Sie das eigentliche Label noch auf durchsichtig (BorderStyle = 0) setzen und natürlich sperren (Enabled = False). Zum Entsperren setzen Sie beim eigentlichen Label Enabled einfach wieder auf True und verbergen das Schatten-Label.
Die Hilfsprozedur Label3DEnabled bündelt diese Aufgabe. Sie versucht zudem noch, den 1-Pixel-Versatz in die Maßeinheit (ScaleMode) des Containers bzw. Parents (wenn dieser der Container ist) umzurechnen, falls Sie die optionale, ausdrückliche Angabe eines ScaleModes im letzten Parameter der Prozedur weglassen.
Public Sub Label3DEnabled(Label As Label, _
ShadowLabel As Label, _
ByVal Enabled As Boolean, _
Optional ByVal ScaleMode As ScaleModeConstants = -1)
Dim nPixelX As Single
Dim nPixelY As Single
Select Case Enabled
Case False
With Label
.BackStyle = 0
.Enabled = False
.ZOrder 0
End With
With ShadowLabel
If ScaleMode < 0 Then
On Error Resume Next
ScaleMode = .Container.ScaleMode
If Err.Number Then
Err.Clear
ScaleMode = .Parent.ScaleMode
If Err.Number Then
ScaleMode = vbTwips
End If
End If
End If
With .Parent
nPixelX = .ScaleX(1, vbPixels, ScaleMode)
nPixelY = .ScaleY(1, vbPixels, ScaleMode)
End With
.Move Label.Left + nPixelX, Label.Top + nPixelY
. UseMnemonic = Label.UseMnemonic
.Caption = Label.Caption
.ForeColor = vb3DHighlight
.Visible = True
End With
Case True
ShadowLabel.Visible = False
Label.Enabled = True
End Select
End Sub
Beachten Sie, dass das Schatten-Label bei der Darstellung des "gesperrten" Zustands selbst nicht gesperrt ist. Klicks und Doppelklicks als auch Mausereignisse (MouseDown, MouseMove, MouseUp) landen beim Schatten-Label. Sie müssen die Ereignisse gegebenenfalls weiterleiten und die entsprechenden Koordinaten relativ zur Position des Schatten-Labels umrechnen. Denken Sie dabei daran, dass die Positionsangaben des Schatten-Labels in der Maßeinheit des Containers vorliegen, während die Maßeinheit der Koordinaten eines Mausereignisses bei einem Label immer Twips lautet.
|