|
Mit recht einfachen Mitteln können Sie eigene
Schalter-Steuerelemente erstellen, die sich wie CheckBoxen
verhalten, aber anstelle des CheckBox-Kästchens mit dem Häkchen
eigene Grafiken zur Darstellung des Schaltzustandes zeigen.
Sie benötigen dazu lediglich drei Image-Steuerelemente und die
beiden Grafiken für die beiden Schaltzustände. Zwei der
Image-Steuerelemente (zum Beispiel ImgAus und imgEin genannt)
bleiben unsichtbar (Eigenschaft Visible gleich False) und enthalten
je eine der beiden Grafiken (in der Picture-Eigenschaft). Das dritte
Image-Steuerelement (z.B. imgSchalter) enthält in der
Picture-Eigenschaft zunächst die Grafik des Ruhezustandes und in
der Tag-Eigenschaft den Wert 0.
Klickt der Anwender auf das imgSchalter-Steuerelement, werden die
Grafik und der Wert der Tag-Eigenschaft in dessen Click-Ereignis
umgeschaltet:
Private Sub imgSchalter_Click()
If imgSchalter.Tag = "1" Then
imgSchalter.Tag = "0"
Set imgSchalter.Picture = imgAus.Picture
Else
imgSchalter.Tag = "1"
Set imgSchalter.Picture = imgEin.Picture
End If
End Sub
Eigentlich war es das schon. Doch wenn Sie sich die
Funktionsweise einer originalen Visual Basic-CheckBox beim
Umschalten einmal genauer anschauen, werden Sie sehen, dass sich die
grafische Darstellung bereits beim Niederdrücken der linken
Maustaste ein wenig verändert: Das CheckBox-Kästchen wird grau
hinterlegt, solange die Maustaste gedrückt ist. Erst beim Loslassen
der Maustaste wechselt die Darstellung des Zustandes.
Um auch dieses Verhalten nachzubilden, fügen Sie in das
MouseDown-Ereignis von imgSchalter den folgenden Code ein:
Private Sub imgSchalter_MouseDown(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then
If imgSchalter.Tag = "1" Then
Set imgSchalter.Picture = imgEinDown.Picture
Else
Set imgSchalter.Picture = imgAusDown.Picture
End If
End If
End Sub
Zur Aufnahme der zusätzlichen Grafiken für diese
Zwischenzustände benötigen Sie ebenfalls zusätzliche, genau so
wie imgEin und imgAus unsichtbar bleibende Image-Steuerelemente -
hier beispielsweise die Image-Steuerelemente imgAusDown und
imgEinDown.
Wenn Sie nun noch einmal ganz genau hinschauen, während Sie den
Mauszeiger bei niedergedrückter Maustaste von einer originalen
Visual Basic-CheckBox weg bewegen, werden Sie sehen, dass die
grafische Darstellung wieder zum vorherigen Schaltzustand
zurückwechselt, sobald der Mauszeiger den Bereich der CheckBox
verlässt. Lassen Sie die Maustaste dann los, bleibt der
Schaltzustand unverändert. Bewegen Sie jedoch statt dessen den
Mauszeiger wieder in den Bereich der CheckBox hinein, wechselt die
Grafik wieder in den Zwischenzustand. Erst dann, und nur dann, wenn
Sie die Maustaste innerhalb der CheckBox loslassen, wechselt der
Schaltzustand. Dieses Verhalten ist ein Windows-Standard, den Sie
auch bei den meisten anderen Steuerelementen wie etwa auch bei
Schaltflächen (CommandButtons) beobachten können.
Nun, selbstverständlich sollten auch Sie Ihren
"selbstgebaute" Schalter auch in diesem Punkt dem Original
(und den Windows-Standards) entsprechend nachgestalten. Da wir
hierzu auf die Bewegung des Mauszeigers reagieren wollen, ist das
MouseMove-Ereignis der richtige Platz für den dazu gehörenden
Code:
Private Sub imgSchalter_MouseMove(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
Dim nInside As Boolean
If Button = vbLeftButton Then
Select Case X
Case 0 To imgSchalter.Width
Select Case Y
Case 0 To imgSchalter.Height
nInside = True
End Select
End Select
If nInside Then
If imgSchalter.Tag = "1" Then
Set imgSchalter.Picture = imgEinDown.Picture
Else
Set imgSchalter.Picture = imgAusDown.Picture
End If
Else
If imgSchalter.Tag = "1" Then
Set imgSchalter.Picture = imgEin.Picture
Else
Set imgSchalter.Picture = imgAus.Picture
End If
End If
End If
End Sub
Auch wenn der Code in dieser Prozedur erheblich komplizierter
aussieht, als der Code der beiden anderen Ereignis-Prozeduren
unseres imgSchalter-Steuerelements, passiert hier dennoch nicht
besonders viel.
Zunächst wird festgestellt, ob überhaupt eine Maustaste, und
zwar die linke, niedergedrückt ist. Dann wird geprüft, ob sich die
im Parameter X übergebene X-Koordinate
innerhalb des Steuerelements befindet. Ist dies der Fall, wird noch
geprüft, ob sich die Y-Koordinate ebenfalls innerhalb
des Steuerelements befindet. Ist dies ebenfalls der Fall, wird die
prozedurlokale Variable nInside auf True gesetzt. Nur dann, wenn
beide Bedingungen erfüllt sind, befindet sich der Mauszeiger
innerhalb des Bereichs. Anderenfalls bleibt Sie in ihrem Urzustand
False - wir ersparen uns die ausdrückliche Feststellung in weiteren
Case-Verzweigungen, dass sich der Mauszeiger außerhalb des Bereichs
befindet.
Für den Fall, dass nInside auf True gesetzt wurde, weisen wir
der Picture-Eigenschaft von imgSchalter die jeweils passende (dem
Wert der Tag-Eigenschaft entsprechende) Grafik-Variante des
Zwischenzustands zu. Ist nInside dagegen False geblieben, weisen wir
wieder die normale Grafik entsprechend dem Schaltzustand zu.
Verlässt der Mauszeiger also den Bereich, wird der unveränderte
Zustand angezeigt. Bewegt sich der Mauszeiger innerhalb des
Bereichs, wird der Zwischenzustand angezeigt - also auch dann, wenn
sich der Mauszeiger vorher hinaus bewegt hat und nun wieder hinein
bewegt wird.
Daraus ergibt sich auch, dass der Schaltzustand zunächst noch
unverändert ist, wenn der Mauszeiger nach außen bewegt wurde. Wird
dann die Maustaste losgelassen, sorgt Windows selbst dafür,
entsprechend dem besagten Standard, dass das Click-Ereignis auch
nicht ausgelöst wird - der Schaltzustand bleibt eben unverändert.
Den Schalter-Zustand können Sie über die Tag-Eigenschaft
jederzeit ähnlich der Value-Eigenschaft einer CheckBox auswerten:
Select Case imgSchalter.Tag
Case "0"
' Schalter ausgeschaltet
Case "1"
' Schalter eingeschaltet
End Select
|