WM_NCHITTEST message
https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-nchittest
为确定窗口的哪部分对应于特定的屏幕坐标,向窗口发送 WM_NCHITTEST 消息。
例如,当光标移动,鼠标按钮按下或释放,为响应如 WindowFromPoint 函数的调用,会发送该消息。
若鼠标未被捕获,则该消息被发送到光标下面的窗口;否则,该消息被发送到捕获鼠标的窗口。
窗口通过其 WindowProc 函数检索该消息。
#define WM_NCHITTEST 0x0084
LRESULT CALLBACK WindowProc(
_In_ HWND hwnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam);
参数
wParam | 未使用 |
lParam | 低位字指定光标的 x 坐标。该坐标相对于屏幕的左上角。 |
返回值
DefWindowProc 函数返回下列值之一,表明光标热点的位置。
返回代码/值 | 描述 |
HTBORDER 18 | 在无尺寸边界窗口的边界中。 |
HTBOTTOM 15 | 在可调整大小窗口的水平下边框中(用户点击鼠标可以调整垂直方向的窗口) |
HTBOTTOMLEFT 16 | 在可调整大小窗口的边框左下角(用户点击鼠标以斜角调整窗口大小) |
HTBOTTOMRIGHT 17 | 在可调整窗口的边框右下角(用户可点击鼠标以斜角调整窗口大小) |
HTCAPTION 2 | 在标题栏中 |
HTCLIENT 1 | 在客户区域中 |
HTCLOSE 20 | 在 “Close“按钮中 |
HTERROR -2 | 在屏幕背景上或窗口间的分割线上(与 HTNOWHERE 相同,但 DefWindowProc 会产生系统提示音以提示错误)。 |
HTGROWBOX 4 | 在尺寸框中(与 HTSIZE 相同) |
HTHELP 21 | 在 "Help"按钮中 |
HTHSCROLL 6 | 在水平滚动条中 |
HTLEFT 10 | 在可调整大小窗口的左边框中(用户可点击鼠标以水平方式调整窗口大小) |
HTMENU 5 | 在菜单中 |
HTMAXBUTTO N 9 | 在“Maximize”按钮中 |
HTMINBUTTON 8 | 在 “Minimize”按钮中 |
HTNOWHERE 0 | 在屏幕背景或窗口间的分割线上 |
HTREDUCE 8 | 在“Minimize”按钮中 |
HTRIGHT 11 | 在可调整大小窗口的有边框上(用户点击鼠标以水平方式调整窗口大小) |
HTSIZE 4 | 在尺寸框中(与 HTGROWBOX 一样) |
HTSYSMENU 3 | 在窗口菜单上或在子窗口“Close”按钮上 |
HTTOP 12 | 在窗口的顶部水平边框上 |
HTTOPLEFT 13 | 在窗口边框的左上角 |
HTTOPRIGHT 14 | 在窗口边框的右上角 |
HTTRANSPARENT -1 | 在相同线程里由另一个窗口覆盖的窗口中(该消息被发送到相同线程的下层窗口直到其中一个窗口返回非 HTTRANSPARENT) |
HTVSCROLL 7 | 在垂直滚动条中 |
HTZOOM 9 | 在 “Maximize”按钮中 |
Remarks
使用以下代码获取水平和垂直位置:
xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);
如上提及,返回值的低位 short 是 x 坐标。高位 short 是 y 坐标(两者都是有符号值 signed , 因为在具有多监视器的系统上可能为负值)。若返回值被分配给一个变量,可以使用 MAKEPOINTS 宏从返回值获取 POINTS结构。可使用 GET_X_LPARAM 或 GET_Y_LPARAM 宏提取 X 或 Y 坐标。
Important
不可使用 LOWORD 或 HIWORD 宏提取光标位置的 X 或 Y坐标,因为在具有多监视器的系统上返回不正确的结果。具有多监视器的系统可能会有负的 X 或 Y 坐标,而 LOWORD 和 HIWORD 对待坐标作为无符号数值。
Windows Vista: 当创建包含标准标题栏按钮的自定义框架时,该消息会首先被传递给 DwmDefWindowProc 函数。此确保桌面窗口管理器为标题栏按钮提供“hit-testing”。若 DwmDefWindowProc 未处理该消息,对该消息
WM_NCHITTEST 的进一步处理可能需要。
Requirements
最低限度支持客户端 | Windows 2000 Professional ( desktop apps only ) |
最低限度支持服务器 | Windows 2000 Server ( desktop apps only ) |
Header | Winuser.h ( include Windowsx.h ) |