当光标移动到窗体,或鼠标按下,释放时,发送WM_NCHITTEST消息,如何鼠标不被捕获,消息在窗体得到光标之后发出,否则,消息发送到捕获到鼠标的窗体。 WM_NCHITTEST xPos = LOWORD(lParam); // 光标的水平位置(X)yPos = HIWORD(lParam); //光标的垂直位置(Y) Parameters(参数) xPos lParam的低次序数值(X的数值)。指定鼠标指针的X坐标,这个坐标是相对于屏幕左上部进行比效的。 yPos lParam的高次序数值(Y的数值)。指定鼠标指针的Y坐标,这个坐标是相对于屏幕左上部进行比效的。 Return Values(返回值) 返回的值是由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) Remarks(评论) 用一个MAKEPOINTS的宏将lParam转换成POINTS结构 支持信息 Windows NT/2000/XP: Included in Windows NT 3.1 and later. Windows 95/98/Me: Included in Windows 95 and later. |
||
使用 WM_NCHITTEST 消息判断鼠标所在窗口的部位
本例效果图:
WM_NCHITTEST 消息返回后, 消息的 Result 参数表示了鼠标所在窗口的部位. 窗体设计步骤: 新建工程后, 随便添加一个菜单; 设置窗体的 AutoScroll 属性为 True, 并添加一个 Panel 放在合适的位置, 以让窗口出现滚动条. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Menus; type TForm1 = class(TForm) Panel1: TPanel; MainMenu1: TMainMenu; mnuFile: TMenuItem; private procedure MyMsg(var msg: TWMNCHitTest); message WM_NCHITTEST; end; var Form1: TForm1; implementation {$R *.dfm} const arr: array[-2..21] of string = ( 'HTERROR', 'HTTRANSPARENT', 'HTNOWHERE', 'HTCLIENT - 客户区', 'HTCAPTION - 标题', 'HTSYSMENU - 系统菜单', 'HTGROWBOX', 'HTMENU - 菜单', 'HTHSCROLL - 水平滚动条', 'HTVSCROLL - 垂直滚动条', 'HTMINBUTTON - 最小化按钮', 'HTMAXBUTTON - 最大化按钮', 'HTLEFT - 左边界', 'HTRIG - 右边界', 'HTTOP - 上边界', 'HTTOPLEFT - 左上角', 'HTTOPRIG - 右上角', 'HTBOTTOM - 下边界', 'HTBOTTOMLEFT - 左下角', 'HTBOTTOMRIG - 右下角', 'HTBORDER', 'HTOBJECT', 'HTCLOSE - 关闭按钮', 'HTHELP'); procedure TForm1.MyMsg(var msg: TWMNCHitTest); var i: Integer; begin Inherited; i := msg.Result; Text := Format('%d: %s', [i, arr[i]]); end; end. //另附 WM_NCHITTEST 消息中 Result 参数的所有可能值的列表: HTERROR = -2; HTTRANSPARENT = -1; HTNOWHERE = 0; HTCLIENT = 1; HTCAPTION = 2; HTSYSMENU = 3; HTGROWBOX = 4; HTSIZE = HTGROWBOX; HTMENU = 5; HTHSCROLL = 6; HTVSCROLL = 7; HTMINBUTTON = 8; HTMAXBUTTON = 9; HTLEFT = 10; HTRIGHT = 11; HTTOP = 12; HTTOPLEFT = 13; HTTOPRIGHT = 14; HTBOTTOM = 15; HTBOTTOMLEFT = $10; HTBOTTOMRIGHT = 17; HTBORDER = 18; HTREDUCE = HTMINBUTTON; HTZOOM = HTMAXBUTTON; HTSIZEFIRST = HTLEFT; HTSIZELAST = HTBOTTOMRIGHT; HTOBJECT = 19; HTCLOSE = 20; HTHELP = 21;
|