windows系统对鼠标点击事件的处理过程
来源:互联网 发布:淘宝如何找人代付 编辑:程序博客网 时间:2024/06/08 17:03
Windows用这个消息来做什么? “HITTEST”就是“命中测试”的意思,WM_NCHITTEST消息用来获取鼠标当前命中的位置。
WM_NCHITTEST的消息响应函数会根据鼠标当前的坐标来判断鼠标命中了窗口的哪个部位,消息响应函数的返回值指出了部位,例如它可能会返回HTCAPTION,或者HTCLIENT等。(其返回值有很多,请查阅MSDN)。
为了便于理解,我先描述一下Windows对鼠标键按下的响应流程:
1. 确定鼠标键点击的是哪个窗口。Windows会用表记录当前屏幕上各个窗口的区域坐标,当鼠标驱动程序通知Windows鼠标键按下了,Windows根据鼠标的坐标确定它点击的是哪个窗口。
2. 确定鼠标键点击的是窗口的哪个部位。Windows会向鼠标键点击的窗口发送WM_NCHITTEST消息,来询问鼠标键点击的是窗口的哪个部位。(WM_NCHITTEST的消息响应函数的返回值会通知Windows)。通常来说,WM_NCHITTEST消息是系统来处理的,用户一般不会主动去处理它(也就是说,WM_NCHITTEST的消息响应函数通常采用的是Windows默认的处理函数)。
3. 根据鼠标键点击的部位给窗口发送相应的消息。例如:如果WM_NCHITTEST的消息响应函数的返回值是HTCLIENT,表示鼠标点击的是客户区,则Windows会向窗口发送WM_LBUTTONDOWN消息;如果WM_NCHITTEST的消息响应函数的返回值不是HTCLIENT(可能是HTCAPTION、HTCLOSE、HTMAXBUTTON等),即鼠标点击的是非客户区,Windows就会向窗口发送WM_NCLBUTTONDOWN消息。
我们有必要详细讨论一下:如果WM_NCHITTEST的消息响应函数的返回值是HTCAPTION,即指示了鼠标点击了标题栏,接下去Windows的处理是怎样的?
上面已经提到,接下来,Windows会向窗口发送WM_NCLBUTTONDOWN消息。
MSDN对WM_NCLBUTTONDOWN消息描述如下:
WM_NCLBUTTONDOWN
nHittest = (INT) wParam; // hit-test value
pts = MAKEPOINTS(lParam); // position of cursor
WM_NCLBUTTONDOWN的wParam指示了鼠标点击的窗口部位,lParam指示了当前鼠标的坐标。
如果应用程序没有对该消息响应,则由系统默认处理。
系统默认处理又是怎样的呢?系统发现wParam指示了鼠标点击的是标题栏,就会标识当前窗口处于“拖拽状态”(Windows内部记录了每个窗口的状态信息)。由于标识了“拖拽状态”,则从此刻起到鼠标键放开之前,你的鼠标移动状况完全由Windows跟踪。它根据鼠标的移动,使得窗口作“同步”移动。
注意,这个过程中,窗口不会收到WM_NCMOUSEMOVE消息,因为窗口和鼠标是“同步”移动的,你的鼠标相对于窗口是静止的。
- windows系统对鼠标点击事件的处理过程
- 在vc中如何实现对静态文本的鼠标点击事件的处理?
- OpenCV对鼠标事件的处理
- opencv 处理鼠标点击事件
- Qt 处理鼠标点击事件
- 鼠标的点击事件
- View、ViewGroup的点击事件处理过程
- unity ugui对场景中鼠标点击事件的遮挡
- as3 鼠标右键点击事件处理
- div的鼠标点击事件
- Canvas---Canvas事件处理、Canvas元素的鼠标点击事件处理、实现一个元素管理器
- 鼠标事件的处理
- Qml实现对鼠标和键盘事件的简单处理
- WINDOWS下对音频的处理过程
- WINDOWS下对音频的处理过程
- button 鼠标点击的处理
- Android——View对点击事件的处理
- AWT/Swing中处理鼠标双击(多击)以及右键点击的事件处理办法
- IOS 无法设置1像素线宽(高) 解决方案
- xvim garbage collection is no longer supported
- JAVA-导常处理错误
- 2014-3-12 FPGA学习-数码管 2
- 溢出判断<求最值的方法>
- windows系统对鼠标点击事件的处理过程
- JSP配置
- 样式与主题
- 内存卡里照片丢失如何恢复
- 时间
- 如何反编译apk文件得到源码和XML文件
- Java 虚拟机初始堆大小和最大堆大小不能盲目设置
- 最牛B的编码套路
- 关于webview