CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

如何捕获Mid窗体的移动?

楼主fuxc(Michael(继续迷茫))2006-03-11 10:54:09 在 VB / 基础类 提问

以下代码用在普通窗体,可以捕获Form移动事件,  
  但放到MidForm中就没有用,怎么办?  
   
   
  'Form1  
  Option       Explicit  
   
  Private       Sub       Form_Load()  
                  procOld       =       SetWindowLong(hwnd,       GWL_WNDPROC,       AddressOf       SysProc)                   '获得原消息处理句柄,并将消息处理转交自定义函数  
  End       Sub  
   
  Private       Sub       Form_Unload(Cancel       As       Integer)  
                  SetWindowLong       hwnd,       GWL_WNDPROC,       procOld  
  End       Sub  
   
   
  'Module1  
  Option       Explicit  
   
  Public       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  
  Public       Declare       Function       SetWindowLong       Lib       "user32"       Alias       "SetWindowLongA"       (ByVal       hwnd       As       Long,       ByVal       nIndex       As       Long,       ByVal       dwNewLong       As       Long)       As       Long  
   
  Public       Const       GWL_WNDPROC       =       (-4)  
  Public       Const       WM_SYSCOMMAND       =       &H112  
  Public       Const       WM_MOVE       =       &H3  
   
  Public       procOld       As       Long  
   
  Public       Function       SysProc(ByVal       hwnd       As       Long,       ByVal       iMsg       As       Long,       ByVal       wParam       As       Long,       ByVal       lParam       As       Long)       As       Long  
  Static       i       As       Integer,       j       As       Integer  
                  SysProc       =       CallWindowProc(procOld,       hwnd,       iMsg,       wParam,       lParam)  
                  If       iMsg       =       WM_MOVE       Then       MsgBox       "Move"  
  End       Function 问题点数:200、回复次数:4Top

1 楼cool_man(土豆)回复于 2006-03-11 15:37:08 得分 0

gzTop

2 楼rainstormmaster(暴风雨 v2.0)回复于 2006-03-11 16:32:26 得分 200

呵呵,看你的代码中有   WM_SYSCOMMAND的声明,其实,离目标已经不远了,事实上,不论是移动窗体,还是调整窗题大小都会触发WM_SYSCOMMAND这个消息,所以根据这个消息处理即可,将模块部分修改为:  
  Option   Explicit  
   
  Public   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  
  Public   Declare   Function   SetWindowLong   Lib   "user32"   Alias   "SetWindowLongA"   (ByVal   hwnd   As   Long,   ByVal   nIndex   As   Long,   ByVal   dwNewLong   As   Long)   As   Long  
   
  Public   Const   GWL_WNDPROC   =   (-4)  
  Public   Const   WM_SYSCOMMAND   =   &H112  
  Public   Const   WM_MOVE   =   &H3  
  Public   Const   SC_MDIMOVE   =   &HF012&  
  Public   procOld           As   Long  
   
  Public   Function   SysProc(ByVal   hwnd   As   Long,   ByVal   iMsg   As   Long,   ByVal   wParam   As   Long,   ByVal   lParam   As   Long)   As   Long  
                Static   i           As   Integer,   j               As   Integer  
                   
                  SysProc   =   CallWindowProc(procOld,   hwnd,   iMsg,   wParam,   lParam)  
                  If   iMsg   =   WM_SYSCOMMAND   Then  
                          Select   Case   wParam  
                          Case   61441,   61442,   61443,   61444,   61445,   61446,   61447,   61448  
                                  MsgBox   "Sized"  
                          Case   SC_MDIMOVE  
                                  MsgBox   "Moved"  
                          End   Select  
                  End   If  
  End   Function  
   
  下面说说61441、61442   、&HF012&这样一些数是怎么来的,我们可以肯定移动窗口、调整窗题大小都会触发WM_SYSCOMMAND消息,所以,先写上这样一些临时代码:  
  Public   Function   SysProc(ByVal   hwnd   As   Long,   ByVal   iMsg   As   Long,   ByVal   wParam   As   Long,   ByVal   lParam   As   Long)   As   Long  
                Static   i           As   Integer,   j               As   Integer  
                   
                  SysProc   =   CallWindowProc(procOld,   hwnd,   iMsg,   wParam,   lParam)  
                  If   iMsg   =   WM_SYSCOMMAND   Then  
                          debug.print   Case   wParam  
                  End   If  
  End   Function  
  观察debug窗口,就得到了这些值Top

3 楼trademark2004()回复于 2006-03-11 17:26:13 得分 0

什么是midform啊?Top

4 楼fuxc(Michael(继续迷茫))回复于 2006-03-12 11:11:11 得分 0

谢谢暴风雨,  
  真正的错误还不是你说的这个,  
  一个低级错误,不好意思讲了,嘿嘿~~~Top

相关问题

  • 关于窗体移动消息捕获的问题?
  • 窗体的移动
  • 捕获窗体的最小化消息
  • 有关捕获窗体的问题
  • 如何移动窗体?
  • 窗体移动问题
  • 关于窗体移动
  • 如何移动windows窗体!
  • 窗体移动问题!!
  • 在没有标题栏的窗体中,怎样移动窗体?

关键词

  • sysproc
  • byval
  • longpublic
  • setwindowlong
  • gwl
  • wndproc
  • as long
  • hwnd
  • sub
  • integer

得分解答快速导航

  • 帖主:fuxc
  • rainstormmaster

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo