VBA: Echte und unechte Schaltflächen

Von: Lorenz Hölscher
Stand: 11. April 2011
Beitrag bewerten
Anmelden um Kommentare zu schreiben

Mehrfach-Schaltflächen

Schaltflächen im XP-Design

"Originale" XP-Schaltflächen

Wenn Sie aber dem abgerundeten Design von Windows XP näher kommen möchten, können Sie mit einem Bitmap-Grafik-Programm (z. B. Photoshop, PaintShop Professional) das Bild einer solchen geteilten Schaltfläche aus einer Bildschirm-Hardcopy herausschneiden und den Text darauf löschen.

Ausgeschnittene Hardcopy der Original-Schaltflächen ohne deren Text

Dieses Bild fügen Sie auf dem Formular als imgSchaltflaeche ein. Dann legen Sie auf den linken Teil davon ein Bezeichnungsfeld lblToClick, welches für die dynamische Beschriftung und das Anklicken der "Schaltfläche" zuständig ist. Auf die rechte "Hälfte" kommt zudem ein Bezeichnungsfeld mit dem Namen lblToDropDown.

Da diese Bezeichnungsfelder natürlich alles verdecken würden, müssen Sie beide durchsichtig machen, indem Sie die BackStyle-Eigenschaft auf fmBackStyleTransparent stellen. Außerdem muss die Caption leer bleiben.

Schaltfläche mit markierten Bezeichnungsfeldern darauf und dem Listenfeld unterhalb

Da so noch keine ausklappbare Liste vorhanden ist, legen Sie darunter noch eine Listbox lstSchaltflaeche an. Damit haben Sie alle vier Komponenten, wie sie im Bild zu sehen sind.

Jetzt gilt es, die drei bedienbaren Elemente btnToClick, btnToDropDown und lstSchaltflaeche zu programmieren. Dabei soll der Klick auf das Listenfeld lstSchaltflaeche nur die Caption von lblToClick anpassen. Erst der anschließende Klick auf lblToClick, also der linken Teil-Schaltfläche, soll die tatsächliche Aktion auslösen, wie es auch unter Office XP üblich ist.

Pseudo-DropDown

Die Schaltfläche btnToDropDown ist entsprechend ihrem Namen nur dazu da, das Listenfeld lstSchaltflaeche "auszuklappen". In Wirklichkeit wechselt nur dessen Sichtbarkeit, aber der Eindruck aus Benutzersicht bleibt derselbe. Entsprechend einfach gestaltet sich auch der zugehörige Code:

Private Sub lblToDropDown_Click()
	Me.lstSchaltflaeche.Visible = Not Me.lstSchaltflaeche.Visible
End Sub

Dabei wird mit .Visible = Not .Visible die Sichtbarkeit jeweils umgeschaltet. Auch das Listenfeld lstSchaltflaeche hat nur wenige Aufgaben:

Private Sub lstSchaltflaeche_Click()
	With Me.lstSchaltflaeche
		Me.lblToClick.Caption = .Value
		.Visible = False
	End With
End Sub

Vorbereitung

Da Listenfelder ja nie zur Entwurfszeit mit Werten gefüllt werden können, muss typischerweise in UserForm_Initialize die Vorbesetzung erfolgen:

Private Sub UserForm_Initialize()
	With lstSchaltflaeche
		.AddItem "Öffnen"
		.AddItem "Schreibgeschützt"
		.AddItem "Als Kopie"
		.ListIndex = 0
	End With
	Me.lblToClick.Caption = "Öffnen"
End Sub

Fertiger Dialog mit Schaltfläche/Kombinationsfeld

Der Dialog präsentiert sich anschließend wie im obigen Bild und lässt sich so benutzen, wie ein geübter WindowsXP-Benutzer das erwartet.

Leider nicht perfekt

So gut das alles funktionieren mag, wenn Sie es wie im Beispiel angeordnet haben, so hat es doch zwei gravierende Nachteile gegenüber dem Original:

  • Die Listbox kann nicht über die Dialog-Begrenzung hinweg angezeigt werden.

  • Es ist nur ein Listenfeld und kein echtes Menü wie im Original.

Gerade wenn Sie sich den FormatvorlageÄndern-Dialog im folgenden Bild ansehen, werden Sie zugeben müssen, dass beides dort unbedingt benötigt wird.

Bild vergrößernDialog FormatvorlageÄndern mit Schaltfläche/PopUp-Menü

Mit ein ganz klein wenig API-Hilfe ist diese letzte Hürde auch zu nehmen. Sie werden sehen, dass der Programmieraufwand sogar deutlich sinkt.

Dies ist eine Leseprobe

Möchten Sie den Beitrag komplett lesen? Dann werden Sie Probemitglied und testen Sie akademie.de 14 Tage kostenlos!

Auf VBA: Schöner schalten - Echte und unechte Schaltflächen erfahren Sie mehr über diesen Beitrag und die weiteren Leseproben.

Weitere Informationen finden Sie auf unserer Infoseite zur Mitgliedschaft und in unseren AGB.

Ich bin bereits Mitglied
Jetzt Probemitglied werden
Ich kann in den 14 Tagen Probezeit formlos z.B. per E-Mail stornieren. Wenn ich das nicht tue, entscheide ich mich für ein