WM_NCHITTEST消息说明
当光标移动到窗体,或鼠标按下,释放时,发送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结构
WMNChitTEST是截获鼠标的消息
我做了个移动的窗体,没有标题栏,写了个右键propomenu,
但是我在WMNChitTEST中是将result返回为htCaption,就可以移动它,可右键就不起作用了!
在窗体上双击还能最大化!
当我屏蔽
if Msg.Result=htClient then
Msg.Result := htCaption;
后,在窗体上点右键,菜单却跑到屏幕(注意是屏幕,不是窗体)的左上角!气死我了!
有什么办法可以既有点右键时菜单即在鼠标的位置显示,点左键又能移动窗体呢?
谢谢!