VB 5/6-Tipp 0294: Dockender ToolBar in MDI-Fenstern
von Herfried K. Wagner
Beschreibung
Dieser Tip zeigt wie Werkzeugfenster ähnlich der IDE in einen MDI-Form am Rand gedockt werden können. Durch einen Doppelklick ist selbiges wieder zu lösen und freischwebend verschiebbar.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: | Download: |
'Dieser Quellcode stammt von http://www.activevb.de 'und kann frei verwendet werden. Für eventuelle Schäden 'wird nicht gehaftet. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. 'Ansonsten viel Spaß und Erfolg mit diesem Source! '------------- Anfang Projektdatei ToolForm.vbp ------------- ' Die Komponente 'Microsoft Windows Common Controls 6.0 (SP6) (mscomctl.ocx)' wird benötigt. '------ Anfang Formular "mdiTools" alias mdiTools.frm ------ ' Steuerelement: Bilderlistenelement "ilsTools" ' Steuerelement: Toolbar "tbrToolBar" Option Explicit Private Sub Form_DblClick() Call DockForm(frmMDI.picDocked, tbrToolBar, vbAlignLeft, _ ToolBarSize, mdiTools) End Sub Private Sub Form_Load() tbrToolBar.Top = 100 tbrToolBar.Left = 100 tbrToolBar.Width = tbrToolBar.ButtonWidth * 2 End Sub Private Sub Form_Unload(Cancel As Integer) If blnBeenden = True Then Cancel = 0 Else Form_DblClick Cancel = True End If End Sub Private Sub tbrToolbar_ButtonClick(ByVal Button As MSComctlLib.Button) Call MsgBox("Sie haben Button Nummer " & Button.Index & " geklickt.") End Sub '------- Ende Formular "mdiTools" alias mdiTools.frm ------- '-------- Anfang Formular "frmMDI" alias frmMDI.frm -------- ' Steuerelement: Bildfeld-Steuerelement "picDocked" ' Steuerelement: Menü "mnuDatei" ' Steuerelement: Menü "mnuDateiOpen" auf mnuDatei ' Steuerelement: Menü "mnuDateiSpeichern" auf mnuDatei 'Autor: Herfried Wagner 'E-Mail: hirf@activevb.de Option Explicit Private Sub MDIForm_DragDrop(Source As Control, x As Single, _ y As Single) If x < ToolBarSize And picDocked.Align <> vbAlignLeft Then Call AlignToolForm(frmMDI.picDocked, mdiTools.tbrToolBar, _ vbAlignLeft, ToolBarSize) ElseIf (x > Me.ScaleWidth - ToolBarSize) And _ (picDocked.Align <> vbAlignRight) Then Call AlignToolForm(frmMDI.picDocked, mdiTools.tbrToolBar, _ vbAlignRight, ToolBarSize) ElseIf y < ToolBarSize And picDocked.Align <> vbAlignTop Then Call AlignToolForm(frmMDI.picDocked, mdiTools.tbrToolBar, _ vbAlignTop, ToolBarSize) ElseIf (y > Me.ScaleHeight - ToolBarSize) And _ (picDocked.Align <> vbAlignBottom) Then Call AlignToolForm(frmMDI.picDocked, mdiTools.tbrToolBar, _ vbAlignBottom, ToolBarSize) Else Call AlignToolForm(frmMDI.picDocked, mdiTools.tbrToolBar, _ vbAlignNone, ToolBarSize, mdiTools, x, y) End If End Sub Private Sub MDIForm_Load() picDocked.BackColor = vbButtonFace Load mdiDraw mdiDraw.Left = 1300 mdiDraw.Top = 280 mdiDraw.Show Load mdiTools mdiTools.Left = 0 mdiTools.Top = 0 mdiTools.Show ToolBarSize = mdiTools.tbrToolBar.ButtonHeight + 200 Me.Show End Sub Private Sub MDIForm_QueryUnload(Cancel As Integer, UnloadMode As Integer) blnBeenden = True End Sub Private Sub picDocked_DblClick() Call AlignToolForm(frmMDI.picDocked, mdiTools.tbrToolBar, _ vbAlignNone, ToolBarSize, mdiTools) End Sub Private Sub picDocked_MouseDown(Button As Integer, Shift As Integer, _ x As Single, y As Single) picDocked.Drag vbBeginDrag End Sub '--------- Ende Formular "frmMDI" alias frmMDI.frm --------- '------ Anfang Modul "modToolBar" alias modToolBar.bas ------ Option Explicit 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 Public blnBeenden As Boolean Public blnAligned As Boolean Public ToolBarSize As Integer Public Function DockForm(picTool As PictureBox, tbrToolB As _ Toolbar, Alignment As AlignConstants, ByVal intToolBarSize As Integer, _ frmRealParent As Form) frmRealParent.Hide tbrToolB.Top = 100 tbrToolB.Left = 100 tbrToolB.Refresh Call SetParent(tbrToolB.hwnd, picTool.hwnd) picTool.Visible = True AlignToolForm picTool, tbrToolB, Alignment, intToolBarSize End Function Public Function AlignToolForm(picTool As PictureBox, tbrToolB As _ Toolbar, Alignment As AlignConstants, ByVal intToolBarSize As Integer, _ Optional frmRealParent As Form, Optional ByVal x As Integer, _ Optional ByVal y As Integer) 'Left If Alignment = vbAlignLeft Then picTool.Align = vbAlignLeft picTool.Width = intToolBarSize tbrToolB.Width = tbrToolB.ButtonWidth tbrToolB.Height = picTool.Height tbrToolB.Refresh picTool.Drag vbEndDrag 'Right ElseIf Alignment = vbAlignRight Then picTool.Align = vbAlignRight picTool.Width = intToolBarSize tbrToolB.Width = tbrToolB.ButtonWidth tbrToolB.Height = picTool.Height tbrToolB.Refresh picTool.Drag vbEndDrag 'Top ElseIf Alignment = vbAlignTop Then picTool.Align = vbAlignTop picTool.Height = ToolBarSize tbrToolB.Height = tbrToolB.ButtonHeight tbrToolB.Width = tbrToolB.ButtonWidth * tbrToolB.Buttons.Count tbrToolB.Refresh picTool.Drag vbEndDrag 'Bottom ElseIf Alignment = vbAlignBottom Then picTool.Align = vbAlignBottom picTool.Height = ToolBarSize tbrToolB.Height = tbrToolB.ButtonHeight tbrToolB.Width = tbrToolB.ButtonWidth * tbrToolB.Buttons.Count tbrToolB.Refresh picTool.Drag vbEndDrag 'None Else Call SetParent(tbrToolB.hwnd, mdiTools.hwnd) If x > 0 Then frmRealParent.Left = x - 200 If y > 0 Then frmRealParent.Top = y - 200 tbrToolB.Top = 100 tbrToolB.Left = 100 tbrToolB.Width = tbrToolB.ButtonWidth * 2 picTool.Visible = False frmRealParent.Show picTool.Drag vbEndDrag End If End Function '------- Ende Modul "modToolBar" alias modToolBar.bas ------- '------- Anfang Formular "mdiDraw" alias mdiDraw.frm ------- ' Steuerelement: Beschriftungsfeld "lblInfo" Option Explicit Private blnWasAligned As Boolean Private Sub Form_Load() lblInfo.Caption = "Doppelklicken Sie die Werkzeugform, um Sie " & _ "an die Hauptform zu docken. " & vbCrLf & "Wenn die Werkzeugform " & _ "an die Hauptform angedockt ist, kann sie durch Doppelklichen " & _ "wieder gelöst werden." lblInfo.Left = 0 End Sub Private Sub Form_Resize() lblInfo.Width = Me.Width lblInfo.Top = Me.ScaleHeight / 2 - lblInfo.Height / 2 'ToolBar andocken, wenn Fenster maximiert. If Me.WindowState = vbMaximized And mdiTools.Visible = True Then Call DockForm(frmMDI.picDocked, mdiTools.tbrToolBar, _ vbAlignLeft, ToolBarSize, mdiTools) End If End Sub '-------- Ende Formular "mdiDraw" alias mdiDraw.frm -------- '-------------- Ende Projektdatei ToolForm.vbp --------------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
Ihre Meinung
Falls Sie Fragen zu diesem Artikel 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.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 2 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von Gerd Kuhlmann am 29.10.2005 um 19:32
Das Beispiel funktioniert ganz prima.
Nachdem ich das Ganze in eine eigene Anwendung eingebaut habe bekomme ich bim Aufruf von
Private Sub Form_DblClick()
Call DockForm(frmMDI.picDocked, tbrToolBar, vbAlignLeft, ToolBarSize, mdiTools)
End Sub
immer die Fehlermeldung: Laufzeitfehler 426 - Es ist nur ein MDI-Formular zugelassen.
Das ist aber mit Sicherheit Fall! Weiß jemand eine Lösung dieses Problems bzw. dessen genaue Ursache?
Kommentar von Uwe Rieger am 10.06.2002 um 13:38
Genau das was ich brauche. Danke :)