Dockende Toolbars
von Herfried K. Wagner
Übersicht
Verwendung
- Dockende Werkzeugleisten werden vor Allem bei MDI-Formularen (Multiple Document Interface) eingesetzt. Meist handelt es sich dabei um ein ToolBar-Steuerelement, dass entweder an einen Rand des MDI-Parent angedockt werden kann oder als unabhängiges Formular innerhalb der MDI-Umgebung verfügbar ist.
- Mehr Flexibilität, der Benutzer kann auswählen, welche Werkzeugleisten angezeigt werden sollen bzw. wo sie positioniert sein sollen. Dies ist besonders bei Programmen mit einer komplexen Arbeitsumgebung von Vorteil, da durch Ausblenden von nicht benötigten Leisten der Arbeitsbereich vergrössert werden kann.
- Auch in SDI-Anwendungen (Single Document Interface) können Werkzeugformulare eingebettet werden, allerdings wird nur sehr selten von dieser Methode gebrauch gemacht.
Abbildung 1: Screenshot des Beispiels
Funktion der Werkzeugleisten
In diesem Beispiel werden einem MDI-Parent 2 Werkzeugformulare hinzugefügt. Bei diesen Formularen handelt es sich trotz Bezeichnung mit dem Präfix mdi nicht um echte MDI-Children.
Formularname | Beschreibung |
---|---|
mdiMainBar | Enthält eine Toolbar mit den Standardfunktionen. Diese Werkzeugleiste kann nur am oberen Rand des MDI-Parents gedockt werden oder als unabhängiges Werkzeugformular angezeigt werden. |
mdiToolBar | Enthält Werkzeuge zur Bearbeitung des MDI-Childs mdiDraw. Diese Werkzeugleiste kann an allen vier Rändern gedockt werden, auch wenn bereits die MainBar angezeigt wird. |
Tabelle 1 : Hinzuzufügende Steuerelemente
Wegen eines Fehlers in VB 6.0 [siehe Allgemeines] konnten für die Werkzeugleisten keine MDI-Children verwendet werden, daher wurden die Werkzeugformulare mit der SetParent API-Funktion in die frmMDI eingebettet. Die SetParent API-Funktion wird folgendermassen deklariert:
Public Declare Function SetParent Lib "user32" (ByVal _ hWndChild As Long, ByVal hWndNewParent As Long _ ) As Long Public Declare Function GetParent Lib "user32" (ByVal _ hwnd As Long) As Long
SetParent
Mit SetParent kann unter Angabe des Child-Handles und des Handles auf das neue Parent-Objekt dieses dort eingebettet werden. Diese Funktion wird im Beispiel auch verwendet, um das Parent-Objekt der Toolbar-Steuerelemente auf mdiMainBar und mdiToolBar zu wechseln. Wenn die Werkzeugleiste gedockt ist, wird als Parent-Objekt eine PictureBox verwendet, sonst wird das entsprechende MDI-Formular verwendet.GetParent
Die GetParent API-Funktion wird verwendet, um das Handle auf das Parent-Objekt eines Objekts [Steuerelement, Formular] zu erhalten. Die Zugriffsnummer des Parent-Objekts wird als Rückgabewert der Funktion geliefert.Docken und Lösen der Werkzeugleisten
Wenn die Werkzeugleiste gedockt ist, kann sie durch Doppelklicken auf einen Bereich, der nicht durch die Toolbar abgedeckt ist, gelöst werden. Dazu wurden den gedockten Werkzeugleisten auch Grips mit der DrawEdge API-Funktion hinzugefügt. Es wurden auch um die gedockten Werkzeugleisten 3D-Rahmen gezeichnet, um ein Office-ähnliches Aussehen zu erzielen.
Ein ungedocktes Werkzeugformular kann an einen Rand gedockt werden, indem es neben der Toolbar doppelgeklickt wird. Jede Werkzeugleiste hat eine vorgegebene Standardseite, an der sie dann gedockt wird. Über Drag and Drop kann die Werkzeugleiste dann an eine andere Seite gezogen werden.
Die DrawEdge API-Funktion und alle ihre Konstanten und die benötigten Typen sind im Modul modDrawEdge zu finden.
Allgemeines
Probleme bei der Implementierung
Unter Visual Basic 6.0 [SP5] werden Werkzeugformulare, die als MDI-Child verwendet werden, falsch angezeigt. Es wird ein "transparenter", etwa 4 Pixel hoher Abstand zwischen der Titelleiste und dem Client-Bereich des Formulars freigelassen. Unter Visual Basic 5.0 tritt dieser Fehler nicht auf.
Dieses Problem wurde dadurch gelöst, dass die Werkzeugformulare als normale Werkzeugformulare erstellt wurden und anschliessend mit der SetParent API-Funktion in die MDI-Umgebung eingebettet wurden. Dadurch wurde auch erreicht, dass über Strg+F6 die Werkzeugformulare nicht aktiviert werden können. Ausserdem ist es dadurch möglich, die Werkzeugformulare über andere gedockte Werkzeugleisten zu bewegen.
Zusatzfunktionen
Es wurden Menüeinträge hinzugefügt, um Werkzeugleisten einzeln aus- und einzublenden. Das Programm merkt sich, ob die Werkzeugleiste gedockt war oder als Formular angezeigt wurde.
Flexibilität der Lösung
Es ist zu beachten, dass diese Lösung nicht sehr flexibel ist. Das Erweitern auf mehrere Werkzeugleisten ist äusserst kompliziert, da bei Drag and Drop allfällige andere Werkzeugleisten für die aktiven Dockbereiche beachtet werden müssen. Ein Vorteil liegt darin, dass keine fremden ActiveX-Komponeten verwendet werden müssen, sondern dass die gesamte Funktionalität als reiner Visual Basic Quellcode vorliegt.
Am Besten wäre es, ein UserControl zu erstellen oder die Funktionalität in einem Klassenmodul zu implementieren.
Beispiel-Projekt als Download [18000 Bytes]
Ihre Meinung
Falls Sie Fragen zu diesem Tutorial haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.