利用子类处理技术限制窗体的大小
**********警告************* 对以下代码进行修改将有可能导致不可预料的后果,甚至能使您的VB崩溃! 在VBIDE环境中运行本程序之前请先保存您的修改 不要使用断点调试模式,这将导致VB崩溃!
'**********警告*************
'对以下代码进行修改将有可能导致不可预料的后果,甚至能使您的VB崩溃!
'在VBIDE环境中运行本程序之前请先保存您的修改
'不要使用断点调试模式,这将导致VB崩溃!
'**********注意*************
模块:
OptionExplicit
PublicOldWindowProcAsLong
DeclareFunctionGetWindowLongLib"user32"Alias"GetWindowLongA"(ByValhwndAsLong,ByValnIndexAsLong)AsLong
'从指定的窗口结构中取得信息
'参数/类型说明
'hwnd(long):欲为其获取信息的窗口的句柄
'nIndex(long):欲取回的信息,可以是下述任何一个常数
'GWL_EXSTYLE:扩展窗口样式
'GWL_STYLE:窗口样式
'GWL_WNDPROC:该窗口的窗口函数的地址
'GWL_HINSTANCE:拥有窗口的实例的句柄
'GWL_HWNDPARENT:该窗口之父的句柄.不要用SetWindowWord来改变这个值
'GWL_ID:对话框中一个子窗口的标识符
'GWL_USERDATA:含义由应用程序规定
'对话框亦可指定下列常数
'DWL_DLGPROC:这个窗口的对话框函数地址
'DWL_MSGRESULT:在对话框函数中处理的一条消息返回的值
'DWL_USER:含义由应用程序规定
DeclareFunctionSetWindowLongLib"user32"Alias"SetWindowLongA"(ByValhwndAsLong,ByValnIndexAsLong,ByValdwNewLongAsLong)AsLong
'在窗体结构中为指定的窗口设置信息
'参数/类型说明
'hwnd(long)欲为其获取信息的窗口的句柄
'nIndex(long)参考GetWindowLong函数
'dwNewLong(long)由nIndex指定的窗口信息的新值
DeclareSubCopyMemoryLib"kernel32"Alias"RtlMoveMemory"(pDestAsAny,pSourceAsAny,ByValByteLenAsLong)
'这就是在VisualBasic中处理指针的"短柄斧"--CopyMemory.你可能在API文档中找不到它,但它确实存在,并且功能异常强大
'参数/类型说明
'pDest你想写入字节到其中的任何变量的ByRef参数(地址)
'pSource要从其中进行复制的ByRef变量
'ByteLen要复制的字节数
DeclareFunctionCallWindowProcLib"user32"Alias"CallWindowProcA"(ByVallpPrevWndFuncAsLong,ByValhwndAsLong,ByValMsgAsLong,ByValwParamAsLong,ByVallParamAsLong)AsLong
'把控制权传回给原来的窗口过程
PublicConstWM_GETMINMAXINFO=&H24
TypePOINTAPI
xAsLong
yAsLong
EndType
'Thisisthestructurethatispassedbyreference(ByRef)(ieanaddress)toyourmessagehandler(消息侦听器)
'ThekeyitemsinthisstructureareptMinTrackSizeandptMaxTrackSize
TypeMINMAXINFO
ptReservedAsPOINTAPI
ptMaxSizeAsPOINTAPI
ptMaxPositionAsPOINTAPI
ptMinTrackSizeAsPOINTAPI
ptMaxTrackSizeAsPOINTAPI
EndType
PublicFunctionSubClass1_WndMessage(ByValhwndAsLong,ByValMsgAsLong,ByValwpAsLong,ByVallpAsLong)AsLong
'Watchforthepertinentmessagetocomein
IfMsg=WM_GETMINMAXINFOThen
DimMinMaxAsMINMAXINFO
' Thisisnecessarybecausethestructurewaspassedbyitsaddressandthere
' iscurrentlynointrinsicwaytouseanaddressinVisualBasic
CopyMemoryMinMax,ByVallp,Len(MinMax)
'ThisiswhereyousetthevaluesoftheMinX,MinY,MaxX,andMaxY
'Thevaluesplacedinthestructuremustbeinpixels.Thevalues
'normallyusedinVisualBasicareintwips.Theconversionisasfollows:
' pixels=twips wipsperpixel
MinMax.ptMinTrackSize.x=3975Screen.TwipsPerPixelX
MinMax.ptMinTrackSize.y=1740Screen.TwipsPerPixelY
MinMax.ptMaxTrackSize.x=Screen.WidthScreen.TwipsPerPixelX2
MinMax.ptMaxTrackSize.y=3480Screen.TwipsPerPixelY
'Herewecopythedatastructurebackuptotheaddresspassedintheparameters
'becauseWindowswilllooktherefortheinformation.
CopyMemoryByVallp,MinMax,Len(MinMax)
'ThismessagetellsWindowsthatthemessagewashandledsuccessfully
SubClass1_WndMessage=1
ExitFunction
EndIf
'Here,weforwardallirrelevantmessagesontothedefaultmessagehandler.
SubClass1_WndMessage=CallWindowProc(OldWindowProc,hwnd,Msg,wp,lp)
EndFunction
窗体代码:
OptionExplicit
PrivateConstGWL_WNDPROC=(-4)
PrivateSubForm_Load()
'First,weneedtostoretheaddressoftheexistingMessageHandler
OldWindowProc=GetWindowLong(Me.hwnd,GWL_WNDPROC)
'NowwecantellwindowstoforwardallmessagestooutownMessageHandler
CallSetWindowLong(Me.hwnd,GWL_WNDPROC,AddressOfSubClass1_WndMessage)
EndSub
PrivateSubForm_Unload(CancelAsInteger)
'Wemustreturncontrolofthemessagesbacktowindowsbeforetheprogramexits
CallSetWindowLong(Me.hwnd,GWL_WNDPROC,OldWindowProc)
EndSub->
'对以下代码进行修改将有可能导致不可预料的后果,甚至能使您的VB崩溃!
'在VBIDE环境中运行本程序之前请先保存您的修改
'不要使用断点调试模式,这将导致VB崩溃!
'**********注意*************
模块:
OptionExplicit
PublicOldWindowProcAsLong
DeclareFunctionGetWindowLongLib"user32"Alias"GetWindowLongA"(ByValhwndAsLong,ByValnIndexAsLong)AsLong
'从指定的窗口结构中取得信息
'参数/类型说明
'hwnd(long):欲为其获取信息的窗口的句柄
'nIndex(long):欲取回的信息,可以是下述任何一个常数
'GWL_EXSTYLE:扩展窗口样式
'GWL_STYLE:窗口样式
'GWL_WNDPROC:该窗口的窗口函数的地址
'GWL_HINSTANCE:拥有窗口的实例的句柄
'GWL_HWNDPARENT:该窗口之父的句柄.不要用SetWindowWord来改变这个值
'GWL_ID:对话框中一个子窗口的标识符
'GWL_USERDATA:含义由应用程序规定
'对话框亦可指定下列常数
'DWL_DLGPROC:这个窗口的对话框函数地址
'DWL_MSGRESULT:在对话框函数中处理的一条消息返回的值
'DWL_USER:含义由应用程序规定
DeclareFunctionSetWindowLongLib"user32"Alias"SetWindowLongA"(ByValhwndAsLong,ByValnIndexAsLong,ByValdwNewLongAsLong)AsLong
'在窗体结构中为指定的窗口设置信息
'参数/类型说明
'hwnd(long)欲为其获取信息的窗口的句柄
'nIndex(long)参考GetWindowLong函数
'dwNewLong(long)由nIndex指定的窗口信息的新值
DeclareSubCopyMemoryLib"kernel32"Alias"RtlMoveMemory"(pDestAsAny,pSourceAsAny,ByValByteLenAsLong)
'这就是在VisualBasic中处理指针的"短柄斧"--CopyMemory.你可能在API文档中找不到它,但它确实存在,并且功能异常强大
'参数/类型说明
'pDest你想写入字节到其中的任何变量的ByRef参数(地址)
'pSource要从其中进行复制的ByRef变量
'ByteLen要复制的字节数
DeclareFunctionCallWindowProcLib"user32"Alias"CallWindowProcA"(ByVallpPrevWndFuncAsLong,ByValhwndAsLong,ByValMsgAsLong,ByValwParamAsLong,ByVallParamAsLong)AsLong
'把控制权传回给原来的窗口过程
PublicConstWM_GETMINMAXINFO=&H24
TypePOINTAPI
xAsLong
yAsLong
EndType
'Thisisthestructurethatispassedbyreference(ByRef)(ieanaddress)toyourmessagehandler(消息侦听器)
'ThekeyitemsinthisstructureareptMinTrackSizeandptMaxTrackSize
TypeMINMAXINFO
ptReservedAsPOINTAPI
ptMaxSizeAsPOINTAPI
ptMaxPositionAsPOINTAPI
ptMinTrackSizeAsPOINTAPI
ptMaxTrackSizeAsPOINTAPI
EndType
PublicFunctionSubClass1_WndMessage(ByValhwndAsLong,ByValMsgAsLong,ByValwpAsLong,ByVallpAsLong)AsLong
'Watchforthepertinentmessagetocomein
IfMsg=WM_GETMINMAXINFOThen
DimMinMaxAsMINMAXINFO
' Thisisnecessarybecausethestructurewaspassedbyitsaddressandthere
' iscurrentlynointrinsicwaytouseanaddressinVisualBasic
CopyMemoryMinMax,ByVallp,Len(MinMax)
'ThisiswhereyousetthevaluesoftheMinX,MinY,MaxX,andMaxY
'Thevaluesplacedinthestructuremustbeinpixels.Thevalues
'normallyusedinVisualBasicareintwips.Theconversionisasfollows:
' pixels=twips wipsperpixel
MinMax.ptMinTrackSize.x=3975Screen.TwipsPerPixelX
MinMax.ptMinTrackSize.y=1740Screen.TwipsPerPixelY
MinMax.ptMaxTrackSize.x=Screen.WidthScreen.TwipsPerPixelX2
MinMax.ptMaxTrackSize.y=3480Screen.TwipsPerPixelY
'Herewecopythedatastructurebackuptotheaddresspassedintheparameters
'becauseWindowswilllooktherefortheinformation.
CopyMemoryByVallp,MinMax,Len(MinMax)
'ThismessagetellsWindowsthatthemessagewashandledsuccessfully
SubClass1_WndMessage=1
ExitFunction
EndIf
'Here,weforwardallirrelevantmessagesontothedefaultmessagehandler.
SubClass1_WndMessage=CallWindowProc(OldWindowProc,hwnd,Msg,wp,lp)
EndFunction
窗体代码:
OptionExplicit
PrivateConstGWL_WNDPROC=(-4)
PrivateSubForm_Load()
'First,weneedtostoretheaddressoftheexistingMessageHandler
OldWindowProc=GetWindowLong(Me.hwnd,GWL_WNDPROC)
'NowwecantellwindowstoforwardallmessagestooutownMessageHandler
CallSetWindowLong(Me.hwnd,GWL_WNDPROC,AddressOfSubClass1_WndMessage)
EndSub
PrivateSubForm_Unload(CancelAsInteger)
'Wemustreturncontrolofthemessagesbacktowindowsbeforetheprogramexits
CallSetWindowLong(Me.hwnd,GWL_WNDPROC,OldWindowProc)
EndSub->
- 上一篇:强制和防止窗口重画
- 下一篇:在VB中建立可旋转的文本特效
精彩图集
精彩文章