打架有用过讯雷么?它的窗口是怎样实现的?
讯雷的窗口,resize到一定大小,就不能再小了,这样的功能如何实现?resize事件没有参数啊,请高手指点! 问题点数:30、回复次数:7Top
1 楼MmMVP(杜霖:(现在是DooDu的马甲。。))回复于 2005-04-27 21:36:13 得分 5
在resize里判断
假如a是最小数值
if me.heighr<a,then me.height=a
width同理Top
2 楼ffs(薄暮之魂)回复于 2005-04-27 22:15:19 得分 0
好像是哦,我怎么没有想到,谢谢!Top
3 楼Mister(菜青虫)回复于 2005-04-28 01:43:23 得分 10
在 VB 中用子类化消息处理即可实现这种效果,粘份子类化处理的代码给你:
Public Function SubClass_WndMessage(ByVal hWnd As Long, ByVal Msg As Long, ByVal wp As Long, ByVal lp As Long) As Long
If Msg = WM_GETMINMAXINFO Then
Dim MinMax As MINMAXINFO
CopyMemory MinMax, ByVal lp, Len(MinMax)
MinMax.ptMinTrackSize.X =100 '窗口的最小宽度
MinMax.ptMinTrackSize.Y =100 '窗口的最小高度
MinMax.ptMaxTrackSize.X =200 '窗口的最大宽度
MinMax.ptMaxTrackSize.Y =200 '窗口的最大高度
CopyMemory ByVal lp, MinMax, Len(MinMax)
SubClass_WndMessage = 1
Exit Function
End If
SubClass_WndMessage = CallWindowProc(Old_WndProc, hWnd, Msg, wp, lp) '呼叫默认消息函数地址。
End Function
'上面是子类化的消息处理的回调函数。
'用 SetWindowLong 函数更改窗口为 SubClass_WndMessage 函数地址(自定义函数的地址用 AddressOf 运算符取得),该函数的返回值就是原有的消息地址,请务必保存以便在卸载窗口时恢复原有地址。
'需要用到的 API 和用户自定义类型、常量,用 API 浏览器生成一下。
'如果不明白子类化请在 Google 搜索,相关内容很多。Top
4 楼jjkk168(老加班的人--好好学习,天天吃饭)回复于 2005-04-28 01:55:58 得分 5
呵呵,打架我只用过木棍,没用过迅雷。
但楼主可以在Resize里面进行处理
if me.width<什么值 then
me.width = 什么值
end ifTop
5 楼SupermanKing(人类)回复于 2005-04-28 03:06:30 得分 5
建议搂主研究一下Mister(菜青虫)的东西,对你有好处的。
你可以这样看,最大化窗口后的效果。光在Resize里处理
是不行的。Top
6 楼wzzwwz(皮皮鲁)回复于 2005-04-28 09:35:48 得分 5
根据 Mister(菜青虫) 的代码写的
'窗体代码
Option Explicit
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_WNDPROC = (-4)
Private Sub Form_Load()
preWndProc = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf NewFunc)
End Sub
Private Sub Form_Unload(Cancel As Integer)
SetWindowLong Me.hWnd, GWL_WNDPROC, preWndProc
End Sub
'一个标准模块
Option Explicit
Private 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
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Const WM_GETMINMAXINFO = &H24
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
Public preWndProc As Long
Function NewFunc(ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim MinMax As MINMAXINFO
If msg = WM_GETMINMAXINFO Then
MinMax.ptMaxTrackSize.x = 500 '最大宽度,这里是象素单位,不是VB默认的Twip单位,同下
MinMax.ptMaxTrackSize.y = 500 '最小高度
MinMax.ptMinTrackSize.x = 300 '最小宽度
MinMax.ptMinTrackSize.y = 300 '最小高度
CopyMemory ByVal lParam, MinMax, Len(MinMax)
NewFunc = 1
Exit Function
End If
NewFunc = CallWindowProc(preWndProc, hWnd, msg, wParam, lParam)
End Function
如果嫌麻烦,用 MmMVP(杜霖:main(){MmMVP!=MsMVP;while(1) {kiss MM;}}) 的方法
Private Sub Form_Resize()
If Me.Height < 2000 Then Me.Height = 2000
If Me.Width < 2000 Then Me.Width = 2000
End Sub
Top
7 楼ffs(薄暮之魂)回复于 2005-04-28 10:43:52 得分 0
谢谢大家,完全学习!Top




