非客户区域消息
如果鼠标在窗体除客户区域外的部分引发鼠标事件的话,窗体就会收到一个非客户区域消息。非客户区域由边框、菜单栏、标题栏、滚动条、系统菜单、最小化、最大化组成。
非客户区域消息主要是为了系统自身使用,比如,当热点移到窗口边框上时,系统用非客户区域消息把鼠标光标变为两个箭头的光标。窗体必须传递非客户区域消息给DefWindowProc函数,以便利用内置的鼠标处理接口。
对于客户区域的鼠标消息来说,也有一个非客户区域的鼠标消息对应。名字也很类似,只不过非客户区域消息的常量中包含了“NC”。例如,非客户区域内移动光标将产生WM_NCMOUSEMOVE消息,按下鼠标左键将产生WM_NCLBUTTONDOWN消息。
非客户区域消息的lParam参数是包含热点x坐标及y坐标的结构,同客户区域坐标系不同,该坐标是以屏幕坐标系来表示的。屏幕坐标系的(0,0)点表示屏幕的左上角。
wParam参数包含一个hit-test值,hit-test用来指出非客户区域消息是在哪引发的。下面就会对hit-test作详细介绍。
WM_NCHITTEST消息
只要鼠标事件产生,系统就会发送一个WM_NCHITTEST消息到鼠标热点所在窗口或鼠标捕获的窗口。系统根据该消息确定应该发送一个客户区域消息还是非客户区域消息。要想接收鼠标移动及鼠标键消息,就要求应用程序必须在调用DefWindowProc函数时传递WM_NCHITTEST消息。
WM_NCHITTEST消息的lParam参数包含鼠标热点的屏幕坐标,DefWindowProc函数会检查该坐标,并返回一个hit-test值,其中包含了热点的位置。hit-test值可以为下列值之一:
值 | 热点所在位置 |
---|---|
HTBORDER | 不能改变大小的窗口的边框 |
HTBOTTOM | 下边框 |
HTBOTTOMLEFT | 边框的左下角 |
HTBOTTOMRIGHT | 边框的右下角 |
HTCAPTION | 标题栏 |
HTCLIENT | 客户区域 |
HTCLOSE | 关闭按钮 |
HTERROR | 屏幕背景或窗口间的分界线上(与HTNOWHERE相同,但不包括DefWindowProc函数引发beep的错误的位置) |
HTGROWBOX | 缩放格(同HTSIZE) |
HTHELP | 帮助按钮 |
HTHSCROLL | 水平滚动条 |
HTLEFT | 窗口的左边框 |
HTMENU | 菜单中 |
HTMAXBUTTON | 最大化按钮 |
HTMINBUTTON | 最小化按钮 |
HTNOWHERE | 屏幕背景或窗口间的分界线上 |
HTREDUCE | 最小化按钮 |
HTRIGHT | 窗口的右边框 |
HTSIZE | 缩放格(同HTGROWBOX). |
HTS |