可以这样: 在Form_Resize事件中 if Me.With<100* screen.TwipsPerPixelX then me.with=100* Screen.TwipsPerPixelX if Me.Height<100* screen.TwipsPerPixelX then me.Height=100* Screen.TwipsPerPixelX 还有另一种拦截消息的方法:
在模块中: '模块代码 Option ExplicitPrivate Type POINTAPI x As Long y As Long End TypePrivate Const WM_GETMINMAXINFO As Long = &H24&Private Type MINMAXINFO ptReserved As POINTAPI ptMaxSize As POINTAPI ptMaxPosition As POINTAPI ptMinTrackSize As POINTAPI ptMaxTrackSize As POINTAPI End Type Private g_nProcOld As LongPrivate 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 Const GWL_WNDPROC As Long = (-4&)
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd&, _ ByVal nIndex&, ByVal dwNewLong&) As LongPrivate FixMinWid As Long, FixMinHig As Long, FixMaxWid As Long, FixMaxHig As Long, FixMaxX As Long, FixMaxY As LongPublic Sub FixSizeHook(Frm As Form, Optional ByVal MinWidth As Long = -1, Optional ByVal MinHeight As Long = -1, _ Optional ByVal MaxWidth As Long = -1, Optional ByVal MaxHeight As Long = -1, _ Optional ByVal MaxX As Long = -1, Optional ByVal MaxY As Long = -1) FixMinWid = IIf(MinWidth < 0, 0, MinWidth) FixMinHig = IIf(MinHeight < 0, 0, MinHeight) FixMaxWid = IIf(MaxWidth < 0, Screen.Width \ Screen.TwipsPerPixelX, MaxWidth) FixMaxHig = IIf(MaxHeight < 0, Screen.Height \ Screen.TwipsPerPixelY, MaxHeight) FixMaxX = IIf(MaxX < 0, 0, MaxX) FixMaxY = IIf(MaxY < 0, 0, MaxY)
g_nProcOld = SetWindowLong(Frm.hWnd, GWL_WNDPROC, AddressOf WindowProc) End Sub
Public Sub FixSizeUnHook(Frm As Form) Call SetWindowLong(Frm.hWnd, GWL_WNDPROC, g_nProcOld) End Sub
Private Function WindowProc(ByVal hWnd As Long, ByVal iMsg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case iMsg
Case WM_GETMINMAXINFO Dim udtMINMAXINFO As MINMAXINFO
在Form_Resize事件中
if Me.With<100* screen.TwipsPerPixelX then me.with=100* Screen.TwipsPerPixelX
if Me.Height<100* screen.TwipsPerPixelX then me.Height=100* Screen.TwipsPerPixelX
还有另一种拦截消息的方法:
'模块代码
Option ExplicitPrivate Type POINTAPI
x As Long
y As Long
End TypePrivate Const WM_GETMINMAXINFO As Long = &H24&Private Type MINMAXINFO
ptReserved As POINTAPI
ptMaxSize As POINTAPI
ptMaxPosition As POINTAPI
ptMinTrackSize As POINTAPI
ptMaxTrackSize As POINTAPI
End Type
Private g_nProcOld As LongPrivate 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 Const GWL_WNDPROC As Long = (-4&)
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd&, _
ByVal nIndex&, ByVal dwNewLong&) As LongPrivate FixMinWid As Long, FixMinHig As Long, FixMaxWid As Long, FixMaxHig As Long, FixMaxX As Long, FixMaxY As LongPublic Sub FixSizeHook(Frm As Form, Optional ByVal MinWidth As Long = -1, Optional ByVal MinHeight As Long = -1, _
Optional ByVal MaxWidth As Long = -1, Optional ByVal MaxHeight As Long = -1, _
Optional ByVal MaxX As Long = -1, Optional ByVal MaxY As Long = -1)
FixMinWid = IIf(MinWidth < 0, 0, MinWidth)
FixMinHig = IIf(MinHeight < 0, 0, MinHeight)
FixMaxWid = IIf(MaxWidth < 0, Screen.Width \ Screen.TwipsPerPixelX, MaxWidth)
FixMaxHig = IIf(MaxHeight < 0, Screen.Height \ Screen.TwipsPerPixelY, MaxHeight)
FixMaxX = IIf(MaxX < 0, 0, MaxX)
FixMaxY = IIf(MaxY < 0, 0, MaxY)
g_nProcOld = SetWindowLong(Frm.hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub FixSizeUnHook(Frm As Form)
Call SetWindowLong(Frm.hWnd, GWL_WNDPROC, g_nProcOld)
End Sub
Private Function WindowProc(ByVal hWnd As Long, ByVal iMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case iMsg
Case WM_GETMINMAXINFO
Dim udtMINMAXINFO As MINMAXINFO
CopyMemory udtMINMAXINFO, ByVal lParam, Len(udtMINMAXINFO)
With udtMINMAXINFO
.ptMaxSize.x = FixMaxWid
.ptMaxSize.y = FixMaxHig
.ptMaxPosition.x = FixMaxX
.ptMaxPosition.y = FixMaxY
.ptMaxTrackSize.x = .ptMaxSize.x
.ptMaxTrackSize.y = .ptMaxSize.y
.ptMinTrackSize.x = FixMinWid
.ptMinTrackSize.y = FixMinHig
End With
CopyMemory ByVal lParam, udtMINMAXINFO, Len(udtMINMAXINFO)
WindowProc = 0&
Exit Function
End Select
WindowProc = CallWindowProc(g_nProcOld, hWnd, iMsg, wParam, lParam)End Function
在窗体的Form_Load事件中:
FixSizeHook Me, 200, 100, 400, 600, 30, 100 '限制最小及最大尺寸和坐标在窗体的Form_UnLoad事件中:
FixSizeUnHook Me