一个控制窗体不能通过鼠标改变大小的问题

liyd1978 2003-09-12 01:18:37
界面:至少需要最小,关闭按钮
我用了这个函数来实现,但不行,大家帮忙看看

Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Public Const SWP_NOSIZE = &H1
Public Const SWP_NOMOVE = &H2

Public Const HWND_NOTOPMOST = -2


Public Sub SetFormNoSize(ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, cx As Long, cy As Long)
Dim rc As Long

rc = SetWindowPos(hwnd, -1, x, y, cx, cy, SWP_NOMOVE Or SWP_NOSIZE)

End Sub
...全文
57 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
liyd1978 2003-09-18
  • 打赏
  • 举报
回复
呵呵,能用了,谢谢糖人
tangjinn 2003-09-12
  • 打赏
  • 举报
回复
晕,我的可以用..

理解了就好用了
liyd1978 2003-09-12
  • 打赏
  • 举报
回复
用不了啊。
liyd1978 2003-09-12
  • 打赏
  • 举报
回复
谢谢,我用用先
:)
yijiansong 2003-09-12
  • 打赏
  • 举报
回复
UP
tangjinn 2003-09-12
  • 打赏
  • 举报
回复
还有一个。。

Type MINMAXINFO
ptReserved As POINTAPI
ptMaxSize As POINTAPI
ptMaxPosition As POINTAPI
ptMinTrackSize As POINTAPI
ptMaxTrackSize As POINTAPI
End Type
tangjinn 2003-09-12
  • 打赏
  • 举报
回复
忘了个变量
Dim OldProc&

放在前面

tangjinn 2003-09-12
  • 打赏
  • 举报
回复
把 lminw lmaxw 设置为相同,lminh lmaxh 设置为相同, 窗体大小就不能改变了。

Private lminw As Long '最小宽度
Private lminh As Long '最小高度
Private lmaxw As Long '最大宽度
Private lmaxh As Long '最小高度

Private Declare Function SetWindowLong& Lib "user32" _
Alias "SetWindowLongA" (ByVal hwnd&, ByVal nIndex&, _
ByVal dwNewLong&)

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 Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long)


Public Const GWL_WNDPROC = (-4)
Public Const WM_GETMINMAXINFO = &H24


'==================================================
'回调
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 = lminw
MinMax.ptMinTrackSize.y = lminh
MinMax.ptMaxTrackSize.x = lmaxw
MinMax.ptMaxTrackSize.y = lmaxh

CopyMemory ByVal lParam, MinMax, Len(MinMax)

WinProc& = 1
Exit Function
End Select

WinProc& = CallWindowProc(OldProc, hwnd, wMsg, wParam, lParam)
End Function
'==================================================


'==================================================
'挂钩
Sub Hook(ByVal nhWnd&, minw As Long, minh As Long, maxw As Long, maxh As Long)

If OldProc <> 0 Then Exit Sub

mhWnd& = nhWnd&

lminw = minw
lminh = minh
lmaxw = maxw
lmaxh = maxh


OldProc = SetWindowLong(nhWnd&, GWL_WNDPROC, AddressOf WinProc)

End Sub
'==================================================


'==================================================
'脱钩
Sub UnHook()

If OldProc = 0 Then Exit Sub

SetWindowLong mhWnd, GWL_WNDPROC, OldProc
OldProc = 0
End Sub
'==================================================
liyd1978 2003-09-12
  • 打赏
  • 举报
回复
那样是可以达到效果,
但是有2点:
1。界面刷新不好
2。多个窗体工作量太多
踏平扶桑 2003-09-12
  • 打赏
  • 举报
回复
你在resize里面加上语句,当它改变大小得时候自动变为你指定得大小,在定义一个布尔型得数据用来表示最小化,如果最小化就退出resize
liyd1978 2003-09-12
  • 打赏
  • 举报
回复
怎么行呢,
还是能改变的阿
snail2011 2003-09-12
  • 打赏
  • 举报
回复
你要是要窗体的最小和关闭按钮,
也就是说不要最大化按钮了,
在窗体的属性中设置maxbutton=false就可以了.
liyd1978 2003-09-12
  • 打赏
  • 举报
回复
-1 忘记定义 表示 放在所有窗体最前面

7,789

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧