2
www.ChF-Online.de  

Zweigeteiltes Fenster mit verschiebbarem Mittelsteg (Splitter)

   Neuigkeiten
   API-Aufrufe in VBA
   VBA2HTML
   Word
   Word-VBA
 Verschiedenes
 Feld-Arbeiten
aktiv aktiv Form-Sachen
 Auflösungs-Erscheinung
aktiv  Fenster-Splitter
 Fortschrittliches
 Hyperlinks in Userformen
 Kontextmenü erstellen
 Pflichtfeldprüfung
 Vorgabewerte ändern
 Menü-/Symbolleisten
 VBA und Lotus Notes
 VBA und Mail
 Inside VBAIDE
 Von Word nach Outlook
 Fix-und-Fertiges/Projekte
   Word2007 (RibbonX)
   Word2010 (RibbonX)
   Outlook-VBA
   Links zu VB(A)
   DocToHelp
   Netport Express XL
   Astronomie
   Gästebuch
   Volltextsuche
   Sitemap
   Buch:Word-Programmierung
   Impressum & Kontakt
   Datenschutzerklärung
Getestet unter Word2000Getestet unter WordXP  
Beispiel anzeigen
Makro/Datei speichern
Print

Ein Splitter ist in VB ein zweigeteiltes Fenster mit einem verschiebbaren Mittelsteg. Der Mittelsteg kann dabei mit gedrückter Maustaste vertikal oder horizontal verschoben werden, wobei sich gleichzeitig die beiden Fensterhälften in der Breite bzw. Höhe mitändern.
Während man in VB inzwischen auf fertige Controls zurückgreifen kann, möchte ich hier zeigen, wie man sich auch in VBA ohne zusätzliche Controls einen solchen Splitter selber bauen kann.

Fenster-Splitter

Der Mittelsteg ist jedoch kein eigenes Control, sondern er ergibt sich aus dem Abstand der beiden benachbarten Controls auf der Userform.

Das Geheimnis, das hinter der angeblichen Verschiebung steckt, ist nun, dass nicht der Mittelsteg verschoben wird, sondern die Breite der beiden Controls abhängig vom Mauszeiger verändert wird. Dazu wird ein Ereignis der Userform abgefragt, das wohl eher selten verwendet wird: Das .MouseMove-Ereignis.
Bei jeder Veränderung des Mauszeigers über der Userform wird darin geprüft, ob sich der Mauszeiger innerhalb der Breite des Mittelstegs befindet. Ist dies der Fall, wird zum einen der Mauszeiger geändert (was leider nicht sehr zuverlässig funktioniert) und zum anderen wird dann die Funktion  fkt_MoveSplitter zum Anpassen der Control-Breiten aufgerufen. Dieser Funktion werden die beiden Controls, die verändert werden sollen, und die aktuelle Cursorposition im Aufruf mitgegeben.

Private Sub UserForm_MouseMove(ByVal Button As Integer,  _
  ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
If (y > ListBox1.Top) And (y < (ListBox1.Top + ListBox1.Height)) Then 
  If (x > (intXPosTrenn - intTrennBreite)) And (x < ( _
    intXPosTrenn + intTrennBreite)) Then 
      Me.MousePointer = fmMousePointerSizeWE
  Else 
    If Button = 0 Then 
      Me.MousePointer = fmMousePointerDefault
      intXPosTrenn = ListBox2.Left - intTrennBreiteHalb
    End If 
  End If 
Else 
    Me.MousePointer = fmMousePointerDefault
End If 
If (Button = 1) And (Me.MousePointer = fmMousePointerSizeWE) Then 
  fkt_MoveSplitter ListBox1, ListBox2, x, y
End If 

In der Funktion  fkt_MoveSplitter wird neben der Berechnung der beiden Control-Breiten auch kontrolliert, dass die Verschiebung des Mittelstegs nach links und rechts nicht eine Mindestbreite der Controls überschreitet.
Nachdem alle Berechnungen erfolgt sind, werden zum Schluss die beiden Controls über die .Move-Methode mit der neuen Breite positioniert.

Function fkt_MoveSplitter(ByRef ctl1 As Control, ByRef ctl2 As Control, _
  ByVal x As Single, ByVal y As Single)
Dim intBreiteCtl2 As Long 
Dim intBreiteCtl1 As Long 
Dim minXPosTrenn As Long 
Dim maxXPosTrenn As Long 
intXPosTrenn = x
'Verschiebung des Trennbalkens nach links begrenzen  
minXPosTrenn = intMinBreite + intRandLinks + intTrennBreiteHalb
If intXPosTrenn < minXPosTrenn Then 
  intXPosTrenn = minXPosTrenn
End If 
'Verschiebung des Trennbalkens nach rechts begrenzen  
maxXPosTrenn = Me.Width - (intMinBreite + intRandLinks + intTrennBreiteHalb)
If intXPosTrenn > maxXPosTrenn Then 
  intXPosTrenn = maxXPosTrenn
End If 
'Breite Control 1 (links)  
intBreiteCtl1 = intXPosTrenn - (intRandLinks + intTrennBreiteHalb)
'Breite Control 2 (rechts)  
intBreiteCtl2 = Me.Width - (intRandLinks + intBreiteCtl1 + intTrennBreite + _
  intRandLinks)
ctl1.Move intRandLinks, intRandOben, intBreiteCtl1
ctl2.Move intXPosTrenn + intTrennBreiteHalb, intRandOben, intBreiteCtl2
End Function  

 Besucher: 41 online  |  145 heute  |  2799 diesen Monat  |  1584638 insgesamt | Seitenaufrufe: 60   Letzte Änderung: 24.06.2006 © 2001-14 Christian Freßdorf
  Demokratie ist die wiederholt auftauchende Vermutung, daß mehr als die Hälfte der Leute in mehr als der Hälfte der Fälle recht haben.
E. B. White
 powered by phpCMS and PAX