龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VB开发 >

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

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
**********警告************* 对以下代码进行修改将有可能导致不可预料的后果,甚至能使您的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->

精彩图集

赞助商链接