MDI-Fenster Manipulieren
 Info  
Von : Wolfgang Kluge
 Zusatz  
Beispielprojekt (2,40kB)
Printfreundliche Ansicht
Viele Sachen sind unverständlicherweise nicht in die Eigenschaftsliste von Formen aufgenommen worden. Zu den besonders stark vertretenen gehört nach wie vor die MDI-Form. Doch manche wollen nicht auf diverse Einstellungen verzichten.

Einige wollen z.B. nicht, daß der Maximieren-Button aktiv ist....
Und da gibts nur die Lösung der mit API.
Das ganze funktioniert natürlich auch bei "normalen" Fenstern...

 Deklaration:
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 GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nindex As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const GWL_EXSTYLE = (-20)

Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Const MF_BYCOMMAND = &H0
Private Const SC_CLOSE = &HF060
Private Const SC_MAXIMIZE = &HF030
Private Const SC_MINIMIZE = &HF020
Private Const SC_RESTORE = &HF120

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_NOMOVE = &H2
Private Const SWP_NOZORDER = &H4
Private Const SWP_FRAMECHANGED = &H20


Für die Buttons selbst würden die ersten vier genügen. Doch gibts ja auch noch ein Systemmenü.
' Titelbar weglassen
' Dazu muß nicht wie sonst die Caption auf "" gestellt werden..
Dim ret As Long
  ret = GetWindowLong(Me.hwnd, GWL_STYLE)
  SetWindowLong Me.hwnd, GWL_STYLE, ret And Not &HC00000

' Komplettes Systemmenü und Buttons entfernen
Dim ret As Long
  ret = GetWindowLong(Me.hwnd, GWL_STYLE)
  SetWindowLong Me.hwnd, GWL_STYLE, ret And Not &H80000

' Minimieren unterbinden
Dim ret As Long, hMen As Long
  hMen = GetSystemMenu(Me.hwnd, False)
  RemoveMenu hMen, SC_MINIMIZE, MF_BYCOMMAND

  ret = GetWindowLong(Me.hwnd, GWL_STYLE)
  SetWindowLong Me.hwnd, GWL_STYLE, ret And Not &H20000

' Maximieren unterbinden
Dim ret As Long, hMen As Long
  hMen = GetSystemMenu(Me.hwnd, False)
  RemoveMenu hMen, SC_MAXIMIZE, MF_BYCOMMAND

  ret = GetWindowLong(Me.hwnd, GWL_STYLE)
  SetWindowLong Me.hwnd, GWL_STYLE, ret And Not &H10000

' Schließen unterbinden
Dim hMen As Long
  hMen = GetSystemMenu(Me.hwnd, False)
  RemoveMenu hMen, SC_CLOSE, MF_BYCOMMAND

' MDI-Form als ToolWindow
Dim ret As Long
  ret = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
  SetWindowLong Me.hwnd, GWL_EXSTYLE, ret Or &H80


Danach muss dem Fenster nur noch mitgeteilt werden, dass es nu gezeichnet werden muss.
' Fenster aktualisieren
SetWindowPos frmHwnd, 0, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE Or SWP_NOZORDER Or SWP_FRAMECHANGED