当前位置: 首页 > news >正文

WM_NCHITTEST

MSDN对它的解释是:

The WM_NCHITTEST message is sent to a window when the cursor moves, or when a mouse button is pressed or released. If the mouse is not captured, the message is sent to the window beneath the cursor. Otherwise, the message is sent to the window that has captured the mouse.

翻译过来就是:

光标移动按下松开鼠标按钮时,WM_NCHITTEST消息将发送到窗口。如果未捕获鼠标,则消息将发送到光标下的窗口。否则,消息将发送到捕获鼠标的窗口

这个消息是当鼠标移动或者有鼠标键按下时候发出的。

Windows用这个消息来做什么? “HITTEST”就是“命中测试”的意思,WM_NCHITTEST消息用来获取鼠标当前命中的位置

WM_NCHITTEST的消息响应函数会根据鼠标当前的坐标来判断鼠标命中了窗口的哪个部位消息响应函数的返回值指出了部位,例如它可能会返回HTCAPTION,或者HTCLIENT等。其返回值有很多,如下:

返回的值是由DefWindowProc函数所提供的下列数值之一,指出紧跟着光标的位置.

值活动的位置

HTBORDER在一个可以用鼠标自由调整大小的(有边框)的窗上边界时

HTBOTTOM在一个可调窗体大小的下边界水平位置时(使用者可以点下鼠标垂直的调正大小)

HTBOTTOMLEFT在一个可调窗体边界的左下角位置时(使用者可以点下鼠标对角的调窗体大小,从左下向右上调)

HTBOTTOMRIGHT在一个可调窗体边界的右下角位置时(使用者可以点鼠标对角的调窗体大小,从右下向左上)

HTCAPTION在一个标题栏中

HTCLIENT在窗体客户区

HTCLOSE在关闭按钮(窗体)

HTERROR在屏幕的后面或在窗体之间的线上(相当于HTNOWHERE,除了DefWindowProc函数产生的系统发出”嘟”的错误”)

HTGROWBOX我的理解:在窗体里(相同于HTSIZE)(原文:In a size box (same as HTSIZE))

HTHELP在帮助按钮上

HTHSCROLL在水平滚动条中

HTLEFT在窗体的左边界上(使用者可以点击鼠标左右(水平)调窗体的大小)

HTMENU在一个菜单上

HTMAXBUTTON在最大化按钮上

HTMINBUTTON在最小化按钮上

HTNOWHERE在屏幕的后面或在窗体之间的线上(我的理解:两个窗体,一个前,一个后,点后面的窗体产生)

HTREDUCE在一个最小化的按钮上(原文:In a Minimize button)

HTRIGHT在窗体的右边界(使用者能点鼠标水平调正窗体大小)

HTSIZE原文:In a size box (same as HTGROWBOX同样的HTGROWBOX)

HTSYSMENU在一个系统菜单上,或在一个child(子窗体)的一个关闭按钮上

HTTOP在一个窗体上部的边界位置上

HTTOPLEFT在一个窗体上部的边界的左上角

HTTOPRIGHT在一个窗体上部的边界的右上角

HTTRANSPARENT在同一程序的两个窗体,一个窗体被另一个窗体覆盖着(消息会传递到下面的窗体,至到其中的一个窗体离开啦,否则就发送HTTRANSPARENT消息)

HTVSCROLL在垂直滚动条上

HTZOOM在一个最大化按钮上(In a Maximize button)

为了便于理解,我先描述一下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消息,因为窗口和鼠标是“同步”移动的,你的鼠标相对于窗口是静止的。(这些细节你可以自己写个示例来测试并分析得出,事实上我也是这么做的。如果我的观点有错误,欢迎指正)。

相关文章:

  • CreateProcess函数详解
  • CEF类笔记-cef_app
  • cef_client.h
  • cef_browser.h
  • C++ List的用法(整理)
  • cef_v8.h
  • SendMessage 用法详解及消息详解
  • TCP协议下的recv函数
  • CEF网址打不开,提示Check failed: fallback_available == base::win::GetVersion() > base::win::VERSION_WIN8
  • Mt.exe
  • 你所不知道的C和C++运行库
  • 静态库和动态库冲突
  • dll搜索顺序
  • 嵌入V8入门
  • V8编程详解
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 345-反转字符串中的元音字母
  • angular2 简述
  • CSS 专业技巧
  • Magento 1.x 中文订单打印乱码
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Node项目之评分系统(二)- 数据库设计
  • Python打包系统简单入门
  • Redis字符串类型内部编码剖析
  • Spring Boot MyBatis配置多种数据库
  • underscore源码剖析之整体架构
  • 从PHP迁移至Golang - 基础篇
  • 从零开始学习部署
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 构建二叉树进行数值数组的去重及优化
  • 区块链将重新定义世界
  • 阿里云服务器如何修改远程端口?
  • 如何在招聘中考核.NET架构师
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • #1014 : Trie树
  • (ros//EnvironmentVariables)ros环境变量
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)计算机毕业设计高校学生选课系统
  • (一) springboot详细介绍
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .net 获取url的方法
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .net6+aspose.words导出word并转pdf
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [AX]AX2012 SSRS报表Drill through action
  • [C++]指针与结构体
  • [English]英语积累本
  • [IE6 only]关于Flash/Flex,返回数据产生流错误Error #2032的解决方式
  • [IE技巧] 使IE8以单进程的模式运行
  • [JavaWeb]—前端篇
  • [JS] 常用正则表达式集(一)