Die Community zu .NET und Classic VB.
Menü

Dockende Toolbars

 von 

Übersicht 

In diesem Tutorial wird gezeigt, wie man mit einfachen Mitteln ToolBars erstellen kann, die in einem MDI-Fenster angedockt werden können. Das Beispiel verwendet nur das MS Common Controls OCX und einige API-Funktionen, aber kein SubClassing.

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.