Rubrik: Oberfläche · Sonstiges | VB-Versionen: VB4, VB5, VB6 | 01.09.01 |
Größenänderung von Controls zur Laufzeit Mit wenigen Zeilen Code lassen sich (fast) beliebige Controls zur Laufzeit per Maus in ihrer Größe ändern. | ||
Autor: Dieter Otter | Bewertung: | Views: 21.863 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Wie lässt sich z.B. eine PictureBox so modifizieren, dass der Benutzer (also zur Laufzeit) die Möglichkeit hat die PicturBox zu selektieren und dann mit der Maus die Größe zu verändern? Also so ähnlich wie im Entwurfsmodus innerhalb der VB-IDE.
Mit reinen VB-Boardmitteln ist das leider nicht möglich. Aber mit ein paar WinAPI-Funktionen und einem kleinen gewussten Tricks!
Wenn man das Objekt mit einem dicken Fensterrahmen ausstattet, so lässt sich das Objekt dann automatisch - ohne jegliches weiteres Zutun - in seiner Größe verändern. Das einzige, worum man sich kümmern muss, ist das Setzen/Entfernen des dicken Rahmens = Ein/Ausschalten der Größenänderung...
' zunächst die benötigten API-Deklarationen Private Declare Function GetWindowLong Lib "user32" _ Alias "GetWindowLongA" ( _ ByVal hwnd As Long, _ ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib "user32" _ Alias "SetWindowLongA" ( _ ByVal hwnd As Long, _ ByVal nIndex As Long, _ ByVal dwNewLong As Long) As Long Private Declare Function SetWindowPos Lib "user32" ( _ ByVal hwnd As Long, _ ByVal hWndInsertAfter As Long, _ ByVal x As Long, _ ByVal y As Long, _ ByVal cx As Long, _ ByVal cy As Long, _ ByVal wFlags As Long) As Long Private Const SWP_NOSIZE = &H1 Private Const SWP_NOZORDER = &H4 Private Const SWP_NOMOVE = &H2 Private Const SWP_DRAWFRAME = &H20 Private Const GWL_STYLE = (-16) Private Const WS_THICKFRAME = &H40000 ' Ermöglicht die Größe eines Objekts zur Laufzeit zu ändern ' ' bStatus = True, Größenänderung einschalten ' bStatus = False, Größenänderung abschalten ' ===================================================== Public Sub DoResize(hWndParent As Long, _ hWndObject As Long, ByVal bStatus As Boolean) Dim Result As Long Result = GetWindowLong(hWndObject, GWL_STYLE) Or _ WS_THICKFRAME If Not bStatus Then _ Result = Result - WS_THICKFRAME SetWindowLong hWndObject, GWL_STYLE, Result SetWindowPos hWndObject, hWndParent, 0, 0, 0, 0, _ SWP_NOZORDER Or SWP_NOSIZE Or SWP_NOMOVE Or _ SWP_DRAWFRAME End Sub
Am besten ist es, wenn man den gesamten obigen Code in ein Modul "packt".
Um das nachfolgende Beispiel zu testen, plazieren Sie eine PictureBox auf die Form und irgendwo daneben einen CommandButton. Beim ersten Klicken auf den CommandButton wird die Größenänderung eingeschaltet, d.h. jetzt kann die Objektgröße verändert werden. Durch einen nochmaligen Klick auf den CommandButton wird die Größenänderung ausgeschaltet.
' Größen-Änderung ein/ausschalten Private Sub Command1_Click() With Command1 Select Case .Tag Case "Resize" .Tag = "" DoResize Me.hwnd, Picture1.hwnd, False Case Else .Tag = "Resize" DoResize Me.hwnd, Picture1.hwnd, True End Select End With End Sub
Der Code funktioniert natürlich auch mit einer ListBox oder einer TextBox - Voraussetzung ist eben, dass das Control eine hWnd-Eigenschaft besitzt.