Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0294: Dockender ToolBar in MDI-Fenstern

 von 

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:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

GetParent, SetParent

Download:

Download des Beispielprojektes [6,51 KB]

'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-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

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 :)