Wie oft versucht man, den Bildschirm zu teilen? Das ist an sich gar kein Problem - aber wie erlaubt man dem Benutzer, diese Einteilung frei einzustellen? Hier ein Lösungsansatz. Benötigt wird in dem Projekt entweder eine Form oder MDI-Form sowie ein Klassenmodul. Der Code des Klassenmoduls: Option Explicit ' API-Funktion zum Anzeigen der beweglichen Splitterbar Private Declare Function SetParent Lib "user32" ( _ ByVal hWndChild As Long, _ ByVal hWndNewParent As Long) As Long ' Die Kopie des Controls, das der Benutzer als ' Splitter ansieht Private WithEvents mSplitCtrl As PictureBox ' Die intern benötigten Objekte und Variablen Private mSlideCtrl As PictureBox Private msngMin As Single Private msngMax As Single ' Das Ereignis, das ausgelöst wird, sobald der ' "Zieh-Vorgang" beendet ist Public Event OnUpdate(ByVal LEdge As Single, _ ByVal REdge As Single) Public Property Let Max(ByVal vMax As Single) ' Der Wert, den die bewegliche Splitterbar nicht ' überschreiten darf msngMax = vMax End Property Public Property Let Min(ByVal vMin As Single) ' Der Wert, den die bewegliche Splitterbar nicht ' unterschreiten darf msngMin = vMin End Property Public Property Set SlideCtrl(ByVal oCtrl As Object) ' Das Control, das der Benutzer sieht, wenn die ' Splitterbar verschoben wird. Set mSlideCtrl = oCtrl ' Garantieren, daß der bewegliche Teil des ' Splitters vorerst nicht sichtbar ist. mSlideCtrl.Visible = False End Property Public Property Set SplitCtrl(ByVal oCtrl As Object) ' Das Control, das der Benutzer als den eigentlichen ' Splitter sieht Set mSplitCtrl = oCtrl ' Die Prüfung auf den Parent des Controls ist notwendig, ' da die Top- bzw. Height-Eigenschaften des Controls auf ' einer MDI-Form nicht änderbar sind. Außerdem wird ' sichergestellt, daß das Control auch direkt auf einer ' Form oder MDI-Form plaziert ist. If Not TypeOf mSplitCtrl.Parent Is MDIForm Then If TypeOf mSplitCtrl.Parent Is Form Then ' Position und Höhe des Controls festlegen mSplitCtrl.Top = 0 mSplitCtrl.Height = mSplitCtrl.Parent.Height Else ' Ausgeben der Fehlermeldung, da weder eine Form ' noch eine MDI-Form als Parent des Controls ' genutzt wurde. Err.Raise -1, _ "Splitter", "Das ObjectSplitCtrl MUSS auf " & _ "einer Form oder MDIForm plaziert sein!" Exit Property End If End If End Property Private Sub mSplitCtrl_MouseDown(Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then ' Beginnen mit dem Drag-Vorgang ShowSplitter End If End Sub Private Sub mSplitCtrl_MouseMove(Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then ' Den beweglichen Teil des Splitters auf die ' Position des Mauszeigers setzen. MoveSplitter X End If End Sub Private Sub mSplitCtrl_MouseUp(Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then ' Den Drag-Vorgang beenden SetSplitter End If End Sub Private Sub ShowSplitter() ' Der bewegliche Teil des Splitters MUSS ein Child des ' dauerhaft sichtbaren Teils sein. Das ist notwendig, ' falls der Parent eine MDI-Form ist und dadurch der ' bewegliche Teil nicht verschoben werden könnte ' (durch die Align-Eigenschaft). Ist der Parent des ' beweglichen Teils alledings ein Container ' (PictureBox) dann muss die Align-Eigenschaft nicht ' gesetzt sein(vbAlignNone). SetParent mSlideCtrl.hWnd, mSplitCtrl.Parent.hWnd ' Den beweglichen Teil dem dauerhaft sichtbaren Teil ' anpassen und danach auch anzeigen. mSlideCtrl.Height = mSplitCtrl.Height mSlideCtrl.Top = mSplitCtrl.Top mSlideCtrl.Left = mSplitCtrl.Left mSlideCtrl.Width = mSplitCtrl.Width mSlideCtrl.Visible = True End Sub Private Sub MoveSplitter(ByVal X As Single) ' Sicherstellen, daß die Min/Max-Werte eingehalten ' werden. Select Case mSplitCtrl.Left + X Case Is < msngMin mSlideCtrl.Move msngMin - 1 Case Is > msngMax mSlideCtrl.Move msngMax + 1 Case Else ' Den beweglichen Teil des Splitters entsprechend ' dem Mauszeiger positionieren. mSlideCtrl.Move mSplitCtrl.Left + X End Select End Sub Private Sub SetSplitter() ' Die Oberfläche über das Ende des Vorgangs ' unterrichten und die linken zw. rechten ' Koordinaten des Splitters liefern. RaiseEvent OnUpdate(mSlideCtrl.Left, _ mSlideCtrl.Left + mSlideCtrl.Width) ' Den beweglichen Teil wieder verstecken und den ' sichtbaren Splitter neu positionieren. mSlideCtrl.Visible = False mSplitCtrl.Left = mSlideCtrl.Left ' Den beweglichen Teil des Splitters wieder seinem ' ursprünglichen Parent zuweisen, damit bei weiterer ' Bewegung der ganze Vorgang immer noch korrekt ' ablaufen kann. SetParent mSlideCtrl.hWnd, mSplitCtrl.hWnd End Sub Beispiel für den Einsatz der Klasse "cSplitter" Nun der Code: Option Explicit ' Klassenobjekt des Splitters Private WithEvents Splitter As cSplitter Private Sub Form_Load() ' Die Splitterklasse anlegen Set Splitter = New cSplitter ' Zuweisen der Objekte die benötigt werden. ' HINWEIS: picSlider MUSS vom Typ PictureBox sein und ' ein Child des Controls picSplitter ' picSplitter MUSS vom Typ PictureBox sein. Set Splitter.SplitCtrl = picSplitter Set Splitter.SlideCtrl = picSlider Splitter.Min = 500 Splitter.Max = Me.Width - 500 End Sub Private Sub Splitter_OnUpdate(ByVal LEdge As Single, _ ByVal REdge As Single) ' Der Drag-Vorgang wurde beendet und die ' Positionierungsmaßnahmen an der Oberfläche ' können beginnen. Picture1.Width = LEdge Picture2.Left = REdge Picture2.Width = Me.Width - REdge End Sub Dieser Tipp wurde bereits 21.095 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
Neu! sevDTA 3.0 Pro SEPA mit Kontonummernprüfung Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 Access-Tools Vol.1 Über 400 MByte Inhalt Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |