在对话框中,分为客户区和非客户区。即客户可修改操作的区域与不可修改操作的区域。标题栏即属于非客户区。
为了实现窗口可拖动化,在直接贴图的窗口中,即自绘背景图中需要自己实现客户区与非客户区的区分,之后实现非客户区的鼠标拖动功能。
LRESULT CfmudemoDlg::OnNcHitTest(CPoint point)//鼠标状态测试函数(一直循环) { ScreenToClient(&point);//屏幕坐标转换为窗口坐标 if((point.x>19&&point.x<1175)&&(point.y>84&&point.y<599))//测试当前鼠标位置是否在客户区 { return HTCLIENT;//返回客户区标志位 } return HTCAPTION ;//返回标题栏标志位 }
OnNcHitTest(CPoint point)函数为鼠标测试函数,即当鼠标每次移动时,都会执行次函数来判断鼠标的位置,从而执行相应的操作。
在具体实现中发现,函数的CPoint类型的参数为屏幕的坐标,即以整个显示屏的左上角为(0,0)原点,但我们编程中一般会使用窗口坐标,即以我们程序的窗口左上角为原点(0,0)。
因此在具体使用中,需要注意坐标的转换。
使用鼠标测试函数OnNcHitTest(CPoint point)的所需代码:
- 在.h头文件,窗口类的public中声明函数:
afx_msg LRESULT OnNcHitTest(CPoint point);//鼠标操作测试反应函数
- 添加消息,在.cpp文件,消息循环MAP中添加消息:
ON_WM_NCHITTEST()//鼠标操作测试消息
- 在.pp文件中实现OnNcHitTest(CPoint point)函数。
重要:在窗口消息队列中,窗口会优先响应OnNcHitTest(CPoint point)消息。例如把鼠标移动变色的区域返回标题栏区域,则此区域不会产生变色效果,只会实现标题栏功能。
以下是函数的返回值:
· 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 在最大化按钮上。