|
Dialog-Fenster unterscheiden sich von normalen Fenstern (Forms) sich im Allgemeinen dadurch, dass ihre Größe nicht vom Anwender geändert werden kann, dass sie kein Icon in der Titelleiste enthalten, dass sie dort nur auch nur die Schließen-Schaltfläche aufweisen und somit weder maximierbar noch minimierbar sind, und dass sie nicht in der Taskleiste erscheinen. Solch ein Dialog-Fenster erhalten Sie, wenn Sie bei einem Form die Eigenschaft BorderStyle auf 3 ("3 - Fester Dialog"), die Eigenschaften MinButton, MaxButton und ShowInTaskbar auf False setzen (bzw. deren Voreinstellung so belassen), und das Icon löschen (im Eigenschaftenfenster in der Eigenschaft "Icon" den Text "(Symbol)" markieren und löschen).
Allerdings gibt es mittlerweile auch Dialog-Fenster, die im wesentlichen zwar den oben beschriebenen Kriterien entsprechen, deren Größe der Anwender jedoch abweichend von diesem Standard ändern kann. Dazu gehören beispielsweise die neuen Datei-Dialoge im Microsoft Office 2000 und in Windows 2000. Gerade bei solchen Dialogen, bei denen der Umfang ihres eigentlichen Inhalts nicht vorhersehbar ist, bringt die Möglichkeit der Größenänderung erheblichen Komfort für den Anwender - er kann sich so manche Blätterei durch den Inhalt (hier Datei-Listen) sparen. Leider werden Sie unter den bei einem Visual Basic-Form verfügbaren Rahmenstilen (BorderStyle) vergebens nach einer Möglichkeit suchen, ein solches Dialog-Form einzustellen.
Normalerweise werden Rahmenstile Windows-intern beim Erzeugen eines Fensters über Konstanten festgelegt. Die meisten dieser Stile (aber auch nicht immer alle) lassen sich auch nachträglich noch einem Fenster zuweisen. Der Rahmenstil, der für einen "dicken" Rahmen sorgt, der mit der Maus gezogen werden kann, und auch für den entsprechenden Eintrag im Systemmenü des betreffenden Fensters sorgt, ist WS_THICKFRAME.
Die Angaben des Rahmenstils wie auch noch weitere Fenster-Stilangaben werden in einem jedem Fenster eigenen Datenbereich abgelegt. Sie können diesen Bereich nicht so ohne weiteres direkt auslesen oder ändern. Dazu dienen die API-Funktionen GetWindowLong und SetWindowLong. Diese finden die gesuchte Stelle in dem Datenbereich anhand einer Index-Angabe - für die Standard-Fenster-Stile lautet dieser Index GWL_STYLE.
GetWindowLong liefert Ihnen zu einem Fenster-Handle (hWnd-Eigenschaft eines Forms) die dort eingetragene Stile-Kombination als Rückgabewert. Der Funktion SetWindowLong übergeben Sie einen neuen Stile-Wert als zusätzlichen Parameter. Da es sich bei diesem Wert jedoch um ein Bit-Feld handelt, können Sie nicht einfach, wie Sie es von einer Eigenschaft gewohnt sind, einen neuen Stil-Wert (etwa WS_THICKFRAME) zuweisen. Die bereits gesetzten Bits müssen erhalten bleiben, und lediglich das Bit, das den neu zuzuweisenden Stil repräsentiert, darf gesetzt werden. Dies erfolgt mit einer einfachen Oder-Verknüpfung (VB-Operator "Or"). Erst dann können Sie den manipulierten Stil-Wert per SetWindowLong setzen.
Damit das Visual Basic-Form die für es ungewohnte Manipulation überhaupt und auch sicher akzeptiert, muss das Form kurzzeitig unsichtbar gemacht (falls es nicht wie etwa während der Bearbeitung des Form_Load-Ereignisses noch unsichtbar ist) und per Aufruf der Refresh-Methode aktualisiert werden.
Die folgende Hilfsfunktion SizeableDialog fasst die Aufrufe von GetWindowLong und SetWindowLong, das Setzen des neuen Rahmenstils und die Kontrolle der Sichtbarkeit wie auch die Aktualisierung zusammen. Sie übergeben ihr das betreffende Form (MDIForms werden nicht akzeptiert). Der optionale Parameter NoIcon ist auf True voreingestellt. Er sorgt dafür, dass sicherheitshalber das Icon des Forms gelöscht wird, so dass Sie es im Eigenschaftenfenster beim Einstellen des BorderStyles auf 3 belassen können. Die übrigen oben erwähnten Einstellungen werden beim Setzen dieses BorderStyles bereits von VB automatisch passend voreingestellt.
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
Public Sub SizeableDialog(Form As Form, _
Optional ByVal NoIcon As Boolean = True)
Dim nStyle As Long
Dim nRestoreVisible As Boolean
Const GWL_STYLE = (-16)
Const WS_THICKFRAME = &H40000
If TypeOf Form Is MDIForm Then
Err.Raise 380
End If
With Form
If .Visible Then
.Visible = False
nRestoreVisible = True
End If
If NoIcon Then
If .BorderStyle = 3 Then
Set .Icon = Nothing
End If
End If
nStyle = GetWindowLong(.hWnd, GWL_STYLE)
nStyle = nStyle Or WS_THICKFRAME
SetWindowLong .hWnd, GWL_STYLE, nStyle
.Refresh
If nRestoreVisible Then
.Visible = True
End If
End With
End Sub
Die bei den als Beispiele angeführten 2000er Datei-Dialogen in der rechten unteren Ecke erscheinende Grifffläche zum Aufziehen des Fensters wird mit diesem Fensterstil nicht automatisch gesetzt. Sie müssen selbst für deren Vorhandensein sorgen. Ein dazu gebrauchsfertiges, komfortables UserControl finden Sie in der Rubrik "Komponenten" unter "Grip mit Grips".
|