使用 WM_NCHITTEST 消息判断鼠标所在窗口的部位
2008-04-30 14:56
465 查看
本例效果图:
WM_NCHITTEST 消息返回后, 消息的 Result 参数表示了鼠标所在窗口的部位.
窗体设计步骤: 新建工程后, 随便添加一个菜单; 设置窗体的 AutoScroll 属性为 True, 并添加一个 Panel 放在合适的位置, 以让窗口出现滚动条.
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;
相关文章推荐
- 判断软件的闲置时间(使用Application.OnMessage过滤所有键盘鼠标消息)
- TForm.ShowModal只是接管消息循环,禁止外部键盘和鼠标输入到别的窗口,但并不封锁其它窗口继续获取消息(比如WM_TIMER消息仍可被发送到别的窗口上)
- 处理鼠标离开窗口的消息 (WM_MOUSELEAVE)
- [置顶] 界面贴图及WM_NCHITTEST消息的使用
- 判断一个窗口是否被挂起(发WM_NULL消息,或者调用IsHungAppWindow API进行测试)
- 鼠标进入与离开的消息(使用CM_MOUSEENTER来判断是否进入控件)
- 深刻:截获windows的消息并分析实例(DefWindowProc),以WM_NCHITTEST举例(Windows下每一个鼠标消息都是由 WM_NCHITTEST 消息产生的,这个消息的参数包含了鼠标位置的信息)
- WM_ERASEBKGND官方解释(翻译),以及Delphi里所有的使用情况(就是绘制窗口控件背景色,并阻止进一步传递消息)
- 处理鼠标离开窗口的消息 (WM_MOUSELEAVE)
- WM_NCHITTEST 消息使用解说
- OnClick事件的Sender参数的前世今生——TWinControl.WinProc优先捕捉到鼠标消息,然后使用IsControlMouseMsg函数进行消息转发给图形子控件(意外发现OnClick是由WM_LBUTTONUP触发的)
- 【积累】利用WM_NCHITTEST消息实现无标题窗口的拖动
- MFC API——》WM_NCHITTEST、OnNcHitTest (CPoint point) 点击鼠标时产生的消息
- 处理鼠标离开窗口的消息 (WM_MOUSELEAVE)
- dephi中单击鼠标拖动窗口(使用WM_SYSCOMMAND)
- TWinControl的消息覆盖函数大全(41个WM_函数和31个CM_函数,它的WndProc就处理鼠标(转发)、键盘(取消拖动)、焦点、和WM_NCHITTEST一共4类消息)
- 处理鼠标离开窗口的消息 (WM_MOUSELEAVE)
- 利用WM_NCHITTEST消息实现无标题窗口的拖动
- Delphi 实现无窗口移动(发WM_NCHITTEST消息计算,然后再发WM_SYSCOMMAND消息,带参数SC_DRAGMOVE)
- WM_NCHITTEST后鼠标消息收不到