确实不够完美,所以只能“使之无效”: ============================= ''mdiform1: Private Sub MDIForm_Load() Load Form1 Form1.Show End Sub''form1: Private Sub Form_Load() Me.WindowState = 2
prevWndProc = GetWindowLong(Me.hwnd, GWL_WNDPROC) SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf WndProc End Sub''module1: Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPublic Const GWL_WNDPROC = (-4) Public Const SC_MAXIMIZE = &HF030& Public Const SC_SIZE = &HF000 Public Const SC_CLOSE = &HF060 Public Const WM_SYSCOMMAND = &H112 Public Const SC_DEFAULT = &HF160 Public Const WM_NCLBUTTONDBLCLK = &HA3 Public Const SC_RESTORE = &HF120& Public Const SC_MINIMIZE = &HF020&Public prevWndProc As LongPublic Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long On Error GoTo ShowErr If Msg = WM_SYSCOMMAND Then If wParam = SC_RESTORE Then Form1.WindowState = 2 Exit Function ElseIf wParam = SC_MINIMIZE Then Form1.WindowState = 2 Exit Function Else WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam) End If End If
WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam) Exit Function ShowErr: WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam) Exit Function End Function
#If Win32 Then 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 #Else Private Declare Function SetWindowLong Lib "User" (ByVal hwnd As Integer, ByVal nIndex As Integer, ByVal dwNewLong As Long) As Long Private Declare Function GetWindowLong Lib "User" (ByVal hwnd As Integer, ByVal nIndex As Integer) As Long #End IfConst WS_MINIMIZEBOX = &H20000 '最小化 Const WS_MAXIMIZEBOX = &H10000 '最大化 Const GWL_STYLE = (-16)'在 MDIForm 的 MDIForm_Load 事件中加入以下程序码Sub MDIForm_Load() Dim lWnd As Long lWnd = GetWindowLong(Me.hwnd, GWL_STYLE) lWnd = lWnd And Not (WS_MINIMIZEBOX) '最小化 lWnd = lWnd And Not (WS_MAXIMIZEBOX) '最大化 lWnd = SetWindowLong(Me.hwnd, GWL_STYLE, lWnd) End Sub
------------------------------------------这很麻烦
因为MDI窗口的位于标题栏上的子窗口控制按钮实际上是自绘的菜单解决方法不是没有,但是都不够完美
=============================
''mdiform1:
Private Sub MDIForm_Load()
Load Form1
Form1.Show
End Sub''form1:
Private Sub Form_Load()
Me.WindowState = 2
prevWndProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf WndProc
End Sub''module1:
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPublic Const GWL_WNDPROC = (-4)
Public Const SC_MAXIMIZE = &HF030&
Public Const SC_SIZE = &HF000
Public Const SC_CLOSE = &HF060
Public Const WM_SYSCOMMAND = &H112
Public Const SC_DEFAULT = &HF160
Public Const WM_NCLBUTTONDBLCLK = &HA3
Public Const SC_RESTORE = &HF120&
Public Const SC_MINIMIZE = &HF020&Public prevWndProc As LongPublic Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error GoTo ShowErr If Msg = WM_SYSCOMMAND Then
If wParam = SC_RESTORE Then
Form1.WindowState = 2
Exit Function
ElseIf wParam = SC_MINIMIZE Then
Form1.WindowState = 2
Exit Function
Else
WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
End If
End If
WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
Exit Function
ShowErr:
WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
Exit Function
End Function
#If Win32 Then
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
#Else
Private Declare Function SetWindowLong Lib "User" (ByVal hwnd As Integer, ByVal nIndex As Integer, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "User" (ByVal hwnd As Integer, ByVal nIndex As Integer) As Long
#End IfConst WS_MINIMIZEBOX = &H20000 '最小化
Const WS_MAXIMIZEBOX = &H10000 '最大化
Const GWL_STYLE = (-16)'在 MDIForm 的 MDIForm_Load 事件中加入以下程序码Sub MDIForm_Load()
Dim lWnd As Long
lWnd = GetWindowLong(Me.hwnd, GWL_STYLE)
lWnd = lWnd And Not (WS_MINIMIZEBOX) '最小化
lWnd = lWnd And Not (WS_MAXIMIZEBOX) '最大化
lWnd = SetWindowLong(Me.hwnd, GWL_STYLE, lWnd)
End Sub
不像其他的 Form 一样,MDIForm 并没有提供 MaxButton 及 MinButton 的属性来让我们移除最大化及最小化的按钮,如果您想移除 MDIForm 的最大化及最小化的按钮,您可以在 MDIForm 中加入以下的程序,但是如果您只想移除其中的一个,则只要将对应的程序码加上注解符号即可。'请在 MDIForm 的声明区中加入以下声明
将子窗体的属性minbutton和maxbutton均置为false。在mdi窗_load()中加入
frm子窗.show '此时子窗的大小由vb程序默认的大小显示;如在子窗的.load(或.show)中有自己设定的子窗大小代码,此时并不执行)。