level 13
我想实现这样一个效果,当改变VB窗口大小的时候,缩小到一定程度就不能再变小了,而变大到一定的程度也不能改变,应该怎么样做?
2008年04月21日 09点04分
1
level 0
在Form_Resize限制一下大小就可以了,小于。。的时候,=。。大于。。。=。。
2008年04月21日 09点04分
2
level 13
这个虽然能达到要求可是不是我想要的效果,因为这样的话鼠标还是可以到比窗口小的地方,窗口这里会不停的闪.就是到一定的大小后就不能移动鼠标那样的效果
2008年04月21日 09点04分
3
level 0
'首先 建立一个模块将以下代码复制到模块中。Option ExplicitPublic Const GWL_WNDPROC = (-4)Public Const WM_GETMINMAXINFO = &H24Type POINTAPI X As Long y As LongEnd TypeType MINMAXINFO ptReserved As POINTAPI ptMaxSize As POINTAPI ptMaxPosition As POINTAPI ptMinTrackSize As POINTAPI ptMaxTrackSize As POINTAPIEnd TypePrivate Type mForm MinX As Long MinY As Long MaxX As Long MaxY As LongEnd TypePublic OldProc As LongPublic mhWnd As LongDim FrmInf As mFormDeclare 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 LongDeclare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongDeclare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long)Public Function WinProc&(ByVal hWnd&, ByVal wMsg&, ByVal wParam&, ByVal lParam&) Select Case wMsg& Case WM_GETMINMAXINFO Dim MinMax As MINMAXINFO CopyMemory MinMax, ByVal lParam, Len(MinMax) MinMax.ptMinTrackSize.X = FrmInf.MinX: MinMax.ptMinTrackSize.y = FrmInf.MinY MinMax.ptMaxTrackSize.X = FrmInf.MaxX: MinMax.ptMaxTrackSize.y = FrmInf.MaxY CopyMemory ByVal lParam, MinMax, Len(MinMax) WinProc& = 1 Exit Function End Select WinProc& = CallWindowProc(OldProc, hWnd, wMsg, wParam, lParam)End FunctionPublic Function SetFrm(sFrom As Form, MinX As Long, MinY As Long, MaxX As Long, MaxY As Long) FrmInf.MinX = MinX: FrmInf.MinY = MinY FrmInf.MaxX = MaxX: FrmInf.MaxY = MaxY OldProc = SetWindowLong(sFrom.hWnd, GWL_WNDPROC, AddressOf WinProc)End Function'在窗体中调用 Private Sub Form_Load() '调用函数: 窗体,最小窗体_宽,最小窗体_高,最大窗体_宽,最大窗体_高 '数值已像素表示。 Call SetFrm(Me, 300, 400, 800, 600)End SubPrivate Sub Form_Unload(Cancel As Integer) '这个一定要有。 不然程序会崩溃。 Call SetWindowLong(Me.hWnd, GWL_WNDPROC, OldProc)End Sub
2008年04月21日 10点04分
4
厉害!我找了几天,没想到贴吧里有高人,
2022年01月19日 13点01分
level 1
4楼的 好麻烦哦 自己写下 窗体的 width 和 height 值就OK了 用循环控制 大小 或是鼠标坐标等都可以。
2008年04月22日 04点04分
5
level 0
VB自己好像无力解决这个问题.要靠API了.和4楼类似的方法我以前也试过,可以用,虽然是麻烦一些.而且在运行调用API函数的程序前,一定一定记得要保存工程.
2008年04月22日 05点04分
6
level 13
4楼的可以用,而且就是我想要的那种效果,谢谢了~!
2008年04月22日 06点04分
7
level 13
Dim MaxW&, MaxH&, MinW&, MinH&, OldW&, OldH&Private Sub Form_Load() MaxW = 12000: MaxH = 9000 MinW = 4800: MinH = 3600 OldW = Me.Width: OldH = Me.HeightEnd SubPrivate Sub Form_Resize() Me.Width = IIf(Me.Width > MaxW Or Me.Width < MinW, OldW, Me.Width) OldW = Me.Width Me.Height = IIf(Me.Height > MaxH Or Me.Height < MinH, OldH, Me.Height) OldH = Me.HeightEnd Sub
2008年11月20日 10点11分
9
level 2
缩小或大到一定程度之后,窗体响应为假,在为真就可以了,这样不闪。
2022年01月21日 15点01分
10
吧务
level 13
Private Sub Form_Resize() ' 控件随动程序
On Error Resume Next
Dim n1 As Long, n2 As Long
' 窗体最小尺寸控制
n1 = Me.Width: n2 = Me.Height
n1 = IIf(n1 < 12000, 12000, n1)
n2 = IIf(n2 < 6750, 6750, n2)
Me.Width = n1: Me.Height = n2
n1 = Me.ScaleWidth ' n1 = 11760
n2 = Me.ScaleHeight ' n2 = 6180
' 窗体控件尺寸位置
End Sub
2022年01月22日 01点01分
11
窗体最大就是【最大化按钮】所赋予的尺寸。
2022年01月22日 01点01分
窗体尺寸变化了,其窗体内各控件的位置或尺寸也将【随动】。
2022年01月22日 02点01分
注意【On Error Resume Next】不可缺少,否则窗体最小化时将出错。
2022年01月22日 02点01分
level 13
4楼子类化处理WM_GETMINMAXINFO消息是正确(这是大多数知名软件采用的方法,QQ、酷我、迅雷等等),其他都为偏方(拉小会出现闪烁,是拉小后响应代码后拉大,过程中由小到大有时间间隔,人眼能感觉出来)
2022年01月22日 02点01分
12
level 2
先计算出你想要的结果在赋值位置或大小,这样不闪烁。
2022年01月22日 07点01分
14
应该是会闪的,你消息处理不对,在Resize中处理窗口大小,就会反复触发Resize,应该在窗口改变大小之前拦截到WM_GETMINMAXINFO消息处理窗口大小,这样就限制住了,Resize消息也就不会触发多次,效率高多了,如果不用子类化的话目前也只能在Resize中处理是最好的
2022年01月23日 04点01分
嗯 用 鼠标移动事件 就行。
2022年02月13日 07点02分