在VB中可以限制窗体的最小值吗
编号:QA000410
建立日期: 1999年1月25日 最后修改日期:2000年8月27日
所属类别:
Gia:
操作系统:WIN95、WINNT
工具:VB5、VB6
请问,在VB中如何在改变窗体大小时,可以限制窗体的最小值?(比如说,窗体最小只能是2000×2000,最大不限)
回答:
你可以在Resize事件中进行限制。如:
Private Sub Form_Resize()
If WindowState The Exit Sub
If Width < 2000 Then Width = 2000
If Height < 2000 Then Width = 2000
End Sub
如果你要是熟悉MsgBlaster这样的控件(可以在QA000580 "VB5中动态建立带子菜单的菜单"下载),你还可以截取Windows的WM_WINDOWPOSCHANGING这样的消息,这样可以使程序的外观上更好看。具体的做法参考QA000727 "在msgblst中如何处理指向结构变量的地址"。
wgr的意见:
下列代码可以锁定窗口大小:
Option Explicit
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 Declare Function SetWindowLong& Lib "User32" Alias "SetWindowLongA" (ByVal hWnd&, ByVal nIndex&, ByVal dwNewLong&)
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type MINMAXINFO
ptReserved As POINTAPI
ptMaxSize As POINTAPI
ptMaxPosition As POINTAPI
ptMinTrackSize As POINTAPI
ptMaxTrackSize As POINTAPI
End Type
Private procOld As Long
Private udtMMI As MINMAXINFO
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 &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 Function LockWindow(hWnd As Long, Optional MinWidth As Long, Optional MinHeight As Long, Optional MaxWidth As Long, Optional MaxHeight As Long) As Boolean
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 Function
相关问题:
QA003257 "如何禁止窗口改变大小,同时允许最小化、最大化"
此问题由李海回答。
| |
|
|
| |
|
|