RSS
StartseiteKnowledge LibraryTop 10Impressum

Dialoge mit Größenänderung

Größenänderungen bei eigentlich festen Dialogen zulassen

Windows 98/2000 erlauben bei den gemeinsamen Dialogen "Öffnen" und "Speichern" die variable Anpassung der Dialoggröße durch den Benutzer. Unter Visual Basic steht Ihnen nur ein fester Dialog zur Verfügung, den Sie aber mit der gleichen Funktionalität ausstatten können...

Wenn Sie unter Visual Basic ein Formular haben wollen, das durch den Benutzer in seiner Größe veränderbar ist, stehen Ihnen die BorderStyle- Eigenschaften "2 – Änderbar" und "5 – Änderbares Werkzeugfenster" zur Wahl. Bei der Auswahl der Dialogfenster, können Sie nur einen festen Dialog wählen, indem Sie bei der BorderStyle-Eigenschaft "3 – Fester Dialog" wählen.

Windows 98/2000 zeigen aber bei den gemeinsamen Dialogen zum Öffnen und Speichern von Dateien, dass es auch Dialoge gibt, die in ihrer Größe durch den Benutzer veränderbar sind und dennoch alle Eigenschaften eines Dialogs aufweisen. Auffälligste Eigenschaft, ist das Fehlen eines Fenstericons, in der linken Ecke der Titelleiste. Dieses Icon können Sie unter Visual Basic nur beim Dialog-Fenster löschen, bei allen anderen Fensterstilen wird beim Löschen der Icon-Eigenschaft (Text "(Symbol)" markieren und <Entf>-Taste drücken) das Standard Windows-Logo angezeigt.

Sie kommen aber dennoch an Ihr Dialogfenster mit Größenänderung. Zwar kann man einem änderbaren Formular (BorderStyle = "2 – Änderbar") nicht das Anzeigen des Fenstericons austreiben, aber man kann einem festen Dialogfenster (BorderStyle = "3 – Fest einfach") den zusätzlichen Fensterstil WS_THICKFRAME verpassen. Dieser ist für den änderbaren Rahmen eines jeden Windows Fensters zuständig und wird über die API Funktion SetWindowLong gesetzt bzw. zu den bestehenden Fensterstilen hinzugefügt, die zuvor Mithilfe der API Funktion GetWindowLong gelesen wurden. Die API Funktion SetWindowPos erzwingt die Aktualisierung des Formulars.

Die Prozedur MakeSizableDialog fasst diese drei Aktionen zusammen:

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_FRAMECHANGED = &H20
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOZORDER = &H4
Private Const SWP_NOACTIVATE = &H10
Private Const SWP_REFRESH = SWP_NOZORDER Or SWP_NOSIZE Or SWP_NOMOVE Or _
                            SWP_NOACTIVATE Or SWP_FRAMECHANGED

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 Const GWL_STYLE = (-16)

Private Const WS_THICKFRAME = &H40000

Public Sub MakeSizableDialog(ByRef Dialog As Form)
  Dim lStyle As Long
  
  With Dialog
    lStyle = GetWindowLong(.hwnd, GWL_STYLE)
    lStyle = lStyle Or WS_THICKFRAME
    SetWindowLong .hwnd, GWL_STYLE, lStyle
  
    SetWindowPos .hwnd, 0, 0, 0, 0, 0, SWP_REFRESH
  End With
End Sub