欢迎光临
我们一直在努力

利用子类处理技术限制窗体的大小_visualbasic教程

建站超值云服务器,限时71元/月

**********警告*************
对以下代码进行修改将有可能导致不可预料的后果,甚至能使您的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\twipsperpixel
  MinMax.ptMinTrackSize.x=3975\Screen.TwipsPerPixelX
  MinMax.ptMinTrackSize.y=1740\Screen.TwipsPerPixelY
  MinMax.ptMaxTrackSize.x=Screen.Width\Screen.TwipsPerPixelX\2
  MinMax.ptMaxTrackSize.y=3480\Screen.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->

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 利用子类处理技术限制窗体的大小_visualbasic教程
分享到: 更多 (0)