原文链接 -> 传送门
消息含义:
WM_NCHITTEST 消息在鼠标移动、点击、释放或者响应 WindowFromPoint 函数时产生。
WM_NCHITTEST 消息的响应函数会根据鼠标当前的屏幕坐标来判断鼠标命中了窗口的哪个部位,消息响应函数的返回值指出了具体命中的部位名称(见下方返回值)。如果鼠标没有被捕捉,WM_NCHITTEST 消息在窗体得到光标之后发出。否则,消息发送到捕获到鼠标的窗体。
窗口通过它的 WindowProc 函数接收消息,但此消息一般默认由操作系统的 DefWindowProc 函数来响应。
小甲鱼温馨提示:这个消息比较实用,为了促进理解,有必要跟大家描述一下 Windows 对鼠标键按下的响应流程:
1. 确定鼠标键点击的是哪个窗口:Windows 会事先记录当前屏幕上各个窗口的区域坐标,当鼠标驱动程序通知 Windows 鼠标按键被按下了,Windows 根据鼠标的坐标确定它点击的是哪个窗口;
2. 确定鼠标键点击的是窗口的哪个部位:Windows 会向鼠标键点击的那个窗口发送 WM_NCHITTEST 消息,来询问鼠标键点击的是窗口的哪个部位。(WM_NCHITTEST 消息的响应函数通过返回值会告知 Windows 被按下部位的名称)。通常来说,WM_NCHITTEST 消息是由操作系统来处理的,我们一般不会主动去处理它;
3. 根据鼠标键点击的部位给窗口发送相应的消息:比如 WM_NCHITTEST 消息的响应函数返回值是 HTCLIENT,表示鼠标点击的是客户区,则 Windows 会向窗口发送 WM_LBUTTONDOWN 消息;再如 WM_NCHITTEST 消息的响应函数返回值是 HTCAPTION,即鼠标点击的是非客户区(标题栏),Windows 就会向窗口发送 WM_NCLBUTTONDOWN 消息。
消息定义:
#define WM_NCHITTEST 0x0084
参数解析:
wParam:此参数没有用到。
lParam:低位字节表示相对于屏幕左上角的 X 坐标。高位字节表示相对于屏幕左上角的 Y 坐标。
返回值:
DefWindowProc 函数的返回值如表所示,显示鼠标热点的位置。
|
返回代码(值) |
含义 |
|
HTBORDER(18) |
在不具有可变大小边框的窗口的边框上 |
|
HTBOTTOM(15) |
在可变大小窗口的水平边框的底部(用户可以点鼠标竖直调整窗口大小) |
|
HTBOTTOMLEFT(16) |
在可变大小窗口边框的左下角(用户可以点鼠标对角调整窗口大小) |
|
HTBOTTOMRIGHT(17) |
在可变大小窗口边框的右下角(用户可以点鼠标对角调整窗口大小) |
|
HTCAPTION(2) |
在标题栏中 |
|
HTCLIENT(1) |
在客户区中 |
|
HTCLOSE(20) |
在关闭按钮中 |
|
HTERROR(-2) |
在屏幕背景或窗口之间的分隔线上(与 HTNOWHERE 相同,除了 Windows 的DefWindowProc 函数产生一个系统响声以指明错误) |
|
HTGROWBOX(4) |
在缩放框中(与 HTSIZE 相同) |
|
HTHELP(21) |
在帮助按钮中 |
|
HTHSCROLL(6) |
在水平滚动条上 |
|
HTLEFT(10) |
在可变大小窗口的左边框上(用户可以点鼠标水平调整窗口大小) |
|
HTMENU(5) |
在菜单中 |
|
HTMAXBUTTON(9) |
在最大化按钮上 |
|
HTMINBUTTON(8) |
在最小化按钮上 |
|
HTNOWHERE(0) |
不在任何窗口上 |
|
HTREDUCE(8) |
在最小化按钮上 |
|
HTRIGHT(11) |
在可变大小窗口的右边框上(用户可以点鼠标水平调整窗口大小) |
|
HTSIZE(4) |
在缩放框中(与 HTGROWBOX 相同) |
|
HTSYSMENU(3) |
在窗口菜单或子窗口的关闭按钮上 |
|
HTTOP(12) |
在窗口上水平边框 |
|
HTTOPLEFT(13) |
在窗口边框的左上角 |
|
HTTOPRIGHT(14) |
在窗口边框的右上角 |
|
HTTRANSPARENT(-1) |
在一个相同线程被其它窗口覆盖的窗口中(该消息将会被发送到在相同线程的下面的窗口,直到其中一个窗口返回非 HTTRANSPARENT 代码) |
|
HTVSCROLL(7) |
在垂直滚动条中 |
|
HTZOOM(9) |
在最大化按钮上 |
备注:
1. 使用下面的代码获取鼠标的水平和垂直位置:
1. xPos = GET_X_LPARAM(lParam);
2. yPos = GET_Y_LPARAM(lParam);
复制代码
2. 如上面所示,X 坐标在 lParam 参数的低位字节;Y 坐标在 lParam 参数的高位字节(两个都是有符号值,因为在多屏幕系统上它们可以为负值)。如果 lParam 参数赋值给一个变量,您可以使用 MAKEPOINTS 宏把 lParam 参数转成 POINTS结构。您也可以使用 GET_X_LPARAM 宏或者 GET_Y_LPARAM 宏提取 X 坐标或者 Y 坐标。
重要:不要使用 LOWORD 宏或者 HIWORD 宏提取鼠标位置的 X 和 Y 坐标,因为在多屏幕系统上这些宏返回错误的结果。多屏幕系统的 X ,Y 坐标可以为负值,而 LOWORD 宏和 HIWORD 宏把坐标认为是无符号数值。
Windows Vista:当创建包含标准的标题按钮自定义框架时,应该首先传递此消息到 DwmDefWindowProc 函数。允许桌面窗口管理器为标题按钮提供命中测试。如果 DwmDefWindowProc 函数没有处理该消息,之后可能需要处理该消息。
需求:
|
Minimum supported client |
Windows 2000 专业版 [仅桌面应用程序] |
|
Minimum supported server |
Windows 2000 服务器版 [仅桌面应用程序] |
|
Header |
Winuser.h (包含于 Windows.h) |




