Eigentlich widersprechen sie ja den MDI-Fenster-Konventionen: MDI-Kind-Forms mit fester, unveränderlicher Größe. Sie können allerdings ohne weiteres bei einem MDI-Kind-Form die BorderStyle-Eigenschaft auf jeden anderen Wert als "2 - Änderbar" setzen. Bei den Werten 1, 3 und 4 wird tatsächlich auch wie erwartet die Größe fixiert. Doch wie Sie in der folgenden Abbildung sehen können, verbleibt unter Umständen (abhängig von Grafiktreiber und Windows-Version) einer kleiner Saum zwischen dem eigentlichen, nun dünneren Rahmen des Forms und seiner Innenfläche.
Der Saum entsteht, weil die MDI-Maschinerie, die an sich für die Darstellung der MDI-Kind-Forms zu sorgen hat, die von Ihnen eigenmächtig gewählte, "illegale" Rahmenform gar nicht mitbekommt. Der Rahmen wird zwar korrekt dünner, doch der Innenbereich des Forms füllt den somit mehr zur Verfügung stehenden Platz nicht von alleine aus. Ein Teil der Windows-Fensterverwaltung ist jedoch durchaus der Ansicht, dass der Bereich dieses Saums sehr wohl zum Innenbereich zu gehören hat, und sorgt daher bei gravierenden Änderungen des Fensterzustandes (erstmaliges Anzeigen usw.) dafür, dass das Paint-Ereignis des MDI-Kind-Forms ausgelöst wird. Dies machen wir uns zu Nutze, indem wir aus der Paint-Ereignisprozedur heraus die API-Funktion SetWindowPos (verpackt in der Hilfsprozedur FixedMDIChildPaint) aufrufen. Mit einem ganzen Rattenschwanz an kombinierten Konstanten der Art SWP_NOirgendwas verhindern wir, dass die Funktion die ihr eigentlich ihrem Namen entsprechend zugedachte Aufgabe vergisst und lediglich den hinter der Konstanten SWP_FRAMECHANGED steckenden Auftrag ausführt, sich um eine Neuberechnung und Neudarstellung des Rahmens zu kümmern.
Im MDI-Kind-Form:
Private Sub Form_Paint()
FixedMDIChildPaint Me
End Sub
Und in einem Standard-Modul:
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
Public Sub FixedMDIChildPaint(Form As Form)
Const SWP_NOMOVE = &H2
Const SWP_NOZORDER = &H4
Const SWP_NOACTIVATE = &H10
Const SWP_FRAMECHANGED = &H20
Const SWP_NOOWNERZORDER = &H200
Const SWP_NOSIZE = &H1
SetWindowPos Form.hwnd, 0, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE _
Or SWP_NOZORDER Or SWP_NOOWNERZORDER Or SWP_FRAMECHANGED
End Sub
|