VC++ 鼠标非显示区域命中测试消息WM_NCHITTEST和相关编程问题学习1

此消息代表非显示区域命中测试;非显示区域,应该指窗口客户区以外的区域;
这个消息优先于所有其他的显示区域和非显示区域鼠标消息;其中lParam参数含有鼠标位置的x和y屏幕坐标,wParam 这里没有用;

消息的返回值:
    下面列出的鼠标击中测试枚举值之一; 

HTBORDER 在不具有可变大小边框的窗口的边框上。 
HTBOTTOM 在窗口的水平边框的底部。 
HTBOTTOMLEFT 在窗口边框的左下角。  
HTBOTTOMRIGHT 在窗口边框的右下角。  
HTCAPTION 在标题条中。  
HTCLIENT 在客户区中。  
HTERROR 在屏幕背景或窗口之间的分隔线上(与HTNOWHERE相同,除了Windows的DefWndProc函数产生一个系统响声以指明错误)。  
HTGROWBOX 在尺寸框中。  
HTHSCROLL 在水平滚动条上。  
HTLEFT 在窗口的左边框上。  
HTMAXBUTTON 在最大化按钮上。  
HTMENU 在菜单区域。  
HTMINBUTTON 在最小化按钮上。  
HTNOWHERE 在屏幕背景或窗口之间的分隔线上。  
HTREDUCE 在最小化按钮上。  
HTRIGHT 在窗口的右边框上。  
HTSIZE 在尺寸框中。(与HTGROWBOX相同)  
HTSYSMENU 在控制菜单或子窗口的关闭按钮上。  
HTTOP 在窗口水平边框的上方。  
HTTOPLEFT 在窗口边框的左上角。  
HTTOPRIGHT 在窗口边框的右上角。  
HTTRANSPARENT 在一个被其它窗口覆盖的窗口中。  
HTVSCROLL 在垂直滚动条中。  
HTZOOM 在最大化按钮上。

这个消息的一个经典应用是,拖动一个无标题栏的窗体或者说我如何实现在客户区也能拖动此窗体;
 

win10, VC6;新建一个对话框工程,或单文档工程;代码为,

UINT CMainFrame::OnNcHitTest(CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	UINT nHitTest = CFrameWnd::OnNcHitTest (point);
    if (nHitTest == HTCAPTION)
	{
		AfxMessageBox("鼠标在标题条中!!!");
	}
	 //if ((nHitTest == HTCLIENT) && (::GetAsyncKeyState (MK_LBUTTON) < 0))
	 //{
     //   nHitTest = HTCAPTION;
		//AfxMessageBox("鼠标在标题条中!!!");
	 //}
	return CFrameWnd::OnNcHitTest(point);
}

如果由对话框类或视图类处理此消息,添加代码,则出错如下;

也就是只能由主框架类处理此消息;代码如前;

根据前面此消息的定义,运行程序,看鼠标放到窗口标题条上,是否弹出对话框;结果是,没反应;代码中注释部分和没注释部分,都是一样;

下回再整;

如果类向导中没有出现 WM_NCHITTEST 消息;则做如下选择;

从代码来看,消息响应函数收到的是鼠标点坐标,再通过点坐标调用 CFrameWnd::OnNcHitTest (point) 获得鼠标位置的枚举值;

猜你喜欢

转载自blog.csdn.net/bcbobo21cn/article/details/113786736