申明必要的API函数,如下调用:Public Declare Function GetWindowLong Lib "user32" _ Alias "GetWindowLongA" _ (ByVal hwnd As Long, _ ByVal nIndex As Long) _ As Long
Public Declare Function SetWindowLong Lib "user32" _ Alias "SetWindowLongA" _ (ByVal hwnd As Long, _ ByVal nIndex As Long, _ ByVal dwNewLong As Long) _ As LongPublic Const GWL_STYLE = (-16) Public Const WS_MAXIMIZEBOX = &H10000'窗体载入 '--------------------------------------------------------- Private Sub MDIForm_Load()
Dim lWinStyle As Long
'屏蔽窗体的最大化按钮 lWinStyle = GetWindowLong(hwnd, GWL_STYLE) And Not WS_MAXIMIZEBOX Call SetWindowLong(hwnd, GWL_STYLE, lWinStyle) Me.Width = 11910: Me.Height = 8910 '定义窗体的大小,保证背景图的显示效果
End Sub
運用子類化技術: 窗體代碼: Private Sub Form_Load() LockWindow Me.hWnd, 100, 100, 400, 400 End Sub 模塊代碼: Option ExplicitPrivate Declare Function SetWindowLong Lib "User32" Alias _ "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes&) Private Declare Function CallWindowProc& Lib "User32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc&, ByVal hWnd&, ByVal Msg&, ByVal wParam&, ByVal lParam&)Private Type POINTAPI x As Long y As Long End TypePrivate Type MINMAXINFO ptReserved As POINTAPI ptMaxSize As POINTAPI ptMaxPosition As POINTAPI ptMinTrackSize As POINTAPI ptMaxTrackSize As POINTAPI End TypePrivate procOld As Long Private udtMMI As MINMAXINFOPrivate Function WindowProc(ByVal hWnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Select Case iMsg Case &H24 'WM_GETMINMAXINFO=&H24 Dim udtMINMAXINFO As MINMAXINFO CopyMemory udtMINMAXINFO, ByVal lParam, 40& With udtMINMAXINFO .ptMaxSize.x = udtMMI.ptMaxSize.x .ptMaxSize.y = udtMMI.ptMaxSize.y .ptMaxPosition.x = 0 .ptMaxPosition.y = 0 .ptMaxTrackSize.x = .ptMaxSize.x .ptMaxTrackSize.y = .ptMaxSize.y .ptMinTrackSize.x = udtMMI.ptMinTrackSize.x .ptMinTrackSize.y = udtMMI.ptMinTrackSize.y 'Debug.Print .ptMaxSize.x & "," & .ptMaxSize.y End With CopyMemory ByVal lParam, udtMINMAXINFO, 40& WindowProc = False Exit Function End Select WindowProc = CallWindowProc(procOld, hWnd, iMsg, wParam, lParam) End Function
Public Sub LockWindow(hWnd As Long, Optional MinWidth As Long, Optional MinHeight As Long, Optional MaxWidth As Long, Optional MaxHeight As Long) With udtMMI '指定窗体最小寬度 If MinWidth = 0 Then .ptMinTrackSize.x = 0 Else .ptMinTrackSize.x = MinWidth '指定窗体最小高度 If MinHeight = 0 Then .ptMinTrackSize.y = 0 Else .ptMinTrackSize.y = MinHeight '指定窗体最大寬度 If MaxWidth = 0 Then .ptMaxSize.x = Screen.Width \ Screen.TwipsPerPixelX Else .ptMaxSize.x = MaxWidth '指定窗体最大高度 If MaxHeight = 0 Then .ptMaxSize.y = Screen.Width \ Screen.TwipsPerPixelX Else .ptMaxSize.y = MaxHeight End With procOld = SetWindowLong(hWnd, -4, AddressOf WindowProc) End Sub
BorderStyle 属性(窗体)
常数 值 描述
vbBSNone 0 无边框
vbFixedSingle 1 固定单线框
vbSizable 2 可变尺寸框(仅对窗体)
vbFixedDoubleialog 3 固定双线框(仅对窗体)
vbFixedToolWindow 4 固定工具窗口
vbSizableToolWindow 5 可变工具窗口
Alias "GetWindowLongA" _
(ByVal hwnd As Long, _
ByVal nIndex As Long) _
As Long
Public Declare Function SetWindowLong Lib "user32" _
Alias "SetWindowLongA" _
(ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) _
As LongPublic Const GWL_STYLE = (-16)
Public Const WS_MAXIMIZEBOX = &H10000'窗体载入
'---------------------------------------------------------
Private Sub MDIForm_Load()
Dim lWinStyle As Long
'屏蔽窗体的最大化按钮
lWinStyle = GetWindowLong(hwnd, GWL_STYLE) And Not WS_MAXIMIZEBOX
Call SetWindowLong(hwnd, GWL_STYLE, lWinStyle) Me.Width = 11910: Me.Height = 8910 '定义窗体的大小,保证背景图的显示效果
End Sub
窗體代碼:
Private Sub Form_Load()
LockWindow Me.hWnd, 100, 100, 400, 400
End Sub
模塊代碼:
Option ExplicitPrivate Declare Function SetWindowLong Lib "User32" Alias _
"SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes&)
Private Declare Function CallWindowProc& Lib "User32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc&, ByVal hWnd&, ByVal Msg&, ByVal wParam&, ByVal lParam&)Private Type POINTAPI
x As Long
y As Long
End TypePrivate Type MINMAXINFO
ptReserved As POINTAPI
ptMaxSize As POINTAPI
ptMaxPosition As POINTAPI
ptMinTrackSize As POINTAPI
ptMaxTrackSize As POINTAPI
End TypePrivate procOld As Long
Private udtMMI As MINMAXINFOPrivate Function WindowProc(ByVal hWnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case iMsg
Case &H24 'WM_GETMINMAXINFO=&H24
Dim udtMINMAXINFO As MINMAXINFO
CopyMemory udtMINMAXINFO, ByVal lParam, 40&
With udtMINMAXINFO
.ptMaxSize.x = udtMMI.ptMaxSize.x
.ptMaxSize.y = udtMMI.ptMaxSize.y
.ptMaxPosition.x = 0
.ptMaxPosition.y = 0
.ptMaxTrackSize.x = .ptMaxSize.x
.ptMaxTrackSize.y = .ptMaxSize.y
.ptMinTrackSize.x = udtMMI.ptMinTrackSize.x
.ptMinTrackSize.y = udtMMI.ptMinTrackSize.y
'Debug.Print .ptMaxSize.x & "," & .ptMaxSize.y
End With
CopyMemory ByVal lParam, udtMINMAXINFO, 40&
WindowProc = False
Exit Function
End Select
WindowProc = CallWindowProc(procOld, hWnd, iMsg, wParam, lParam)
End Function
Public Sub LockWindow(hWnd As Long, Optional MinWidth As Long, Optional MinHeight As Long, Optional MaxWidth As Long, Optional MaxHeight As Long)
With udtMMI
'指定窗体最小寬度
If MinWidth = 0 Then .ptMinTrackSize.x = 0 Else .ptMinTrackSize.x = MinWidth
'指定窗体最小高度
If MinHeight = 0 Then .ptMinTrackSize.y = 0 Else .ptMinTrackSize.y = MinHeight
'指定窗体最大寬度
If MaxWidth = 0 Then .ptMaxSize.x = Screen.Width \ Screen.TwipsPerPixelX Else .ptMaxSize.x = MaxWidth
'指定窗体最大高度
If MaxHeight = 0 Then .ptMaxSize.y = Screen.Width \ Screen.TwipsPerPixelX Else .ptMaxSize.y = MaxHeight
End With
procOld = SetWindowLong(hWnd, -4, AddressOf WindowProc)
End Sub