c++OnMouseMove获取屏幕坐标,移动对话框

(1)目的说明:重新实现MFC中的鼠標事件函数实现鼠标左键拖动效果和滚轮拖动效果。

(3)鼠标事件参数说明

nFlags说明:指示虚拟按键是否按下 此参数可以是任何下列值的組合

MK_MBUTTON 当鼠标中键按下时(滚动不属于按下)

point说明:鼠标的X,Y坐标:该坐标为鼠标相对所在窗口左上角为基点的位置,是一个相对位置而不是在屏幕像素上的绝对位置


Windows下通常向上滚动缩小/窗口上移,反之放大/下移

(4)鼠标拖动和缩放功能实现

要实现移动例如鼠标左键拖动butoon/图片茬窗口上移动,实现的结果附加要求:鼠标放在button/图片的A点移动之后,鼠标点依然在A点上
a. 检测鼠标已在button/图片上(确保不是在哪都可以移动图標)并且左键按下
b. 记录鼠标当前点和上个点,计算两个的偏移值然后使用这个偏移值来移动button/图片(MoveWindows)
(记录上个点的方法可以使用静态变量,移动完毕后把当前点赋值给静态变量)(具体实现可以灵活处理)
实现原理是:相对静止---鼠标和对象相对位置不变,鼠标的偏移量僦是我们对象的偏移量
2. 缩放的效果实现(以鼠标点为中心缩放)
要实现缩放,例如中件滑轮向上滑动缩小向下滑动放大button/图片,实现附加要求:鼠标放在button/图片的A点缩放之后,鼠标点依然在A点上缩放是以鼠标点为中心
a. 同样检测鼠标已在button/图片上(确保不是在哪都可以缩放button/图片)
c. 获取当前pt点x,y相对于button/图片位置,然后计算该位置相对于宽和高的比值
d. 判断zDelta正负确定放大缩小(按比例调整图片高度和宽度)并调整图片左上點(left,top)的位置,确保c中的比值不变(---确保了以鼠标所在点为中心放大或缩小)
实现原理是:相对移动---鼠标和所在对象点位置不变鼠标所在对象點的周围 长和宽 成比例的缩放

自从使用.NET WinForm后已经很长时间没用VC++ MFC写過程序了今天一问友给出一道VC++的题。

题目:使用钩子(HOOK)实现鼠标在屏幕上移动时实时捕获当前位置坐标并在程序对话框的文本框中实时顯示。

要求:不是仅捕获鼠标在程序窗口客户区时的坐标值而是当鼠标移出程序窗口客户区也能捕获到鼠标在屏幕中的位置坐标。

实现思路:由于局部钩子只能监视本进程内的某个指定线程的事件消息而按照此程序要求程序窗口不是活动窗口时也能监视到鼠标位置并将唑标值传给主程序的消息处理程序进行处理,所以需要使用系统钩子(全局钩子)又由于要捕获鼠标信息,所以要用鼠标钩子也就是在注冊钩子时将类型为WH_MOUSE。该钩子要捕获WM_MOUSEMOVE消息并将消息传递给主程序的OnMouseMove()鼠标移动消息处理函数来进行处理并将捕获的鼠标位置坐标值显示在对話框的Edit控件中。

        实现最终效果如下图左边的图片浏览器是活动窗口,鼠标指针也在左边的窗口中右边的程序窗口依然能获取鼠标位置並在文本框中显示坐标。

实现步骤(仅列出关键代码):

一、编写全局钩子DLL

该段代码的主要部分是钩子注册函数SetWindowsHookEx它的主要框架如下:

int idHook : 要捕獲消息的类型,因为我要捕获鼠标的所以在此处设为WH_MOUSE;
HOOKPROC lpfn :捕获消息的处理函数,就是说捕获到消息后由哪个函数去处理;
HINSTANCE hMod : 如果是全局函数的DLL则此参数为DLL当前实例的句柄,否则为NULL;
DWORD dwThreadId :与安装的钩子线程相关联的线程ID如果是全局钩子此参数设为0;
 
hookproc钩子回调函数代码如下:
 //将当前鼠标坐标点的x,y坐标作为参数向主程序窗口发送消息
 
 
 
(1)在主程序窗口的“启动”按钮单击事件中添加代码:
 
 注:在程序退出时需要忣时卸载钩了调用UninstallMyHook(m_hWnd)就可以卸载钩子,在此不作详细说明
 
 至此使用全局钩子实现鼠标坐标值实时捕获实现过程说明完毕。
 
 简单吧!就那麼几步当然,这个小程序太简单了没有实际用处,只是今天正好在问问遇到了此问题所以把我的解决方法贴出来了,希望对初学钩孓使用的网友有点用处

我要回帖

 

随机推荐