Bei einem Form, das keinen eigentlichen, optisch abgesetzten Arbeitsbereich hat, beispielsweise als dialog-ähnliches Form, fehlt eine optische Trennung zwischen Menüleiste und der übrigen Oberfläche. Und auch eine Statuszeile (etwa aus den Microsoft Common Controls) sollte optisch von der übrigen Fläche getrennt erscheinen.
Eine solche Trennung bietet unser Steuerelement MenuBottomLine in Form einer horizontalen Linie, die sich automatisch horizontal oben oder unten ausrichtet (VB-Eigenschaft Align). Sie können zwischen drei Stilen wählen: mit 3D-Effekt eingraviert (mblSunken) oder erhaben (mblRaised), oder als einfache Trennlinie in der im System eingestellten Rahmenkantenfarbe (vbWindowFrame).
Auch mehrfach untereinander angeordnete Toolbars aus den Microsoft Common Controls lassen sich optisch schöner voneinander Trennen. Sie verfügen zwar über eine obere Trennlinie (Eigenschaften Appearance = 1 und BorderStyle = 0), jedoch sind die sich ergebenden Abstände oben und unten nicht symmetrisch. Platzieren Sie die Toolbars (mit Appearance = 0) zwischen MenuBottomLine-Steuerelementen, können Sie in deren Eigenschaften SpaceTop und SpaceBottom die Freiräume oberhalb und unterhalb der Trennlinien pixelgenau festlegen.
Das Steuerelement MenuBottomLine ist fensterlos - die Linien sind Line-Steuerelemente, die daher direkt auf dem Container dargestellt werden. Wie das normale Line-Steuerelement ist es völlig passiv und kann auch nicht den Fokus erhalten. Die Freiräume oberhalb und Unterhalb der Trennlinie nehmen automatisch die Hintergrundfarbe an, wenn die Eigenschaft AutoBackColor auf True gesetzt ist (Voreinstellung).
Ein kleiner Trick sorgt dafür, dass das Steuerelement nur horizontal oben oder unten ausgerichtet werden kann - es sperrt sich im Resize-Ereignis des UserControls automatisch gegen eine vertikale Ausrichtung und gegen eine Aufhebung der Ausrichtung. Auch wenn Sie im Eigenschaftenfenster per Doppelklick die Align-Eigenschaft weiterschalten wollen, springt der Wert immer wieder automatisch auf vbAlignTop oder vbAlignBottom.
Es ist nicht notwendig, das UserControl als OCX zu kompilieren - Sie können es auch als privates Steuerelement-Modul in ein Projekt einfügen und dort verwenden.
Public Enum MenuBottomLineStyleConstants
mblSunken
mblRaised
mblSingle
End Enum
Private pAutoBackColor As Boolean
Private pSpaceBottom As Single
Private pSpaceTop As Single
Private pStyle As MenuBottomLineStyleConstants
Public Property Get AutoBackColor() As Boolean
AutoBackColor = pAutoBackColor
End Property
Public Property Let AutoBackColor(New_AutoBackColor As Boolean)
pAutoBackColor = New_AutoBackColor
PropertyChanged "AutoBackColor"
End Property
Public Property Get SpaceBottom() As Single
SpaceBottom = pSpaceBottom \ Screen.TwipsPerPixelY
End Property
Public Property Let SpaceBottom(New_SpaceBottom As Single)
Select Case New_SpaceBottom
Case pSpaceBottom \ Screen.TwipsPerPixelY
Exit Property
Case Is < 0
Err.Raise 380
Case Else
pSpaceBottom = New_SpaceBottom * Screen.TwipsPerPixelY
UserControl_Resize
PropertyChanged "SpaceBottom"
End Select
End Property
Public Property Get SpaceTop() As Single
SpaceTop = pSpaceTop \ Screen.TwipsPerPixelY
End Property
Public Property Let SpaceTop(New_SpaceTop As Single)
Select Case New_SpaceTop
Case pSpaceTop \ Screen.TwipsPerPixelY
Exit Property
Case Is < 0
Err.Raise 380
Case Else
pSpaceTop = New_SpaceTop * Screen.TwipsPerPixelY
UserControl_Resize
PropertyChanged "SpaceTop"
End Select
End Property
Public Property Get Style() As MenuBottomLineStyleConstants
Style = pStyle
End Property
Public Property Let Style(New_Style As MenuBottomLineStyleConstants)
Select Case New_Style
Case pStyle
Case mblSunken, mblRaised, mblSingle
pStyle = New_Style
UserControl_Resize
PropertyChanged "Style"
Case Else
Err.Raise 380
End Select
End Property
Private Sub UserControl_AmbientChanged(PropertyName As String)
If pAutoBackColor Then
Select Case LCase$(PropertyName)
Case "backcolor"
UserControl.BackColor = Ambient.BackColor
End Select
End If
End Sub
Private Sub UserControl_Paint()
Static sInProc As Boolean
If sInProc Then
Exit Sub
Else
sInProc = True
End If
UserControl_Resize
sInProc = False
End Sub
Private Sub UserControl_Resize()
Static sInProc As Boolean
If sInProc Then
Exit Sub
Else
sInProc = True
End If
With Extender
Select Case .Align
Case vbAlignTop, vbAlignBottom
Case Else
.Align = vbAlignTop
End Select
End With
With UserControl
.Enabled = False
Select Case pStyle
Case mblSunken
lnShadow.BorderColor = vb3DShadow
lnHighlight.BorderColor = vb3DHighlight
.Height = 2 * Screen.TwipsPerPixelY + pSpaceTop + pSpaceBottom
Case mblRaised
lnShadow.BorderColor = vb3DHighlight
lnHighlight.BorderColor = vb3DShadow
.Height = 2 * Screen.TwipsPerPixelY + pSpaceTop + pSpaceBottom
Case mblSingle
lnShadow.BorderColor = vbWindowFrame
.Height = Screen.TwipsPerPixelY + pSpaceTop + pSpaceBottom
End Select
End With
With lnShadow
.Y1 = pSpaceTop
.Y2 = .Y1
.X1 = 0
.X2 = UserControl.ScaleWidth
End With
With lnHighlight
.Visible = Not CBool(pStyle = mblSingle)
.Y1 = Screen.TwipsPerPixelY + pSpaceTop
.Y2 = .Y1
.X1 = 0
.X2 = UserControl.ScaleWidth
End With
sInProc = False
End Sub
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
With PropBag
pAutoBackColor = .ReadProperty("AutoBackColor", True)
pSpaceBottom = .ReadProperty("SpaceBottom", 0)
pSpaceTop = .ReadProperty("SpaceTop", 0)
pStyle = .ReadProperty("Style", mblSunken)
End With
End Sub
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
With PropBag
.WriteProperty "AutoBackColor", pAutoBackColor, True
.WriteProperty "SpaceBottom", pSpaceBottom, 0
.WriteProperty "SpaceTop", pSpaceTop, 0
.WriteProperty "Style", pStyle, mblSunken
End With
End Sub
Private Sub UserControl_Initialize()
pAutoBackColor = True
End Sub
|