MFC对话框可拖动化

在对话框中,分为客户区和非客户区。即客户可修改操作的区域与不可修改操作的区域。标题栏即属于非客户区。

为了实现窗口可拖动化,在直接贴图的窗口中,即自绘背景图中需要自己实现客户区与非客户区的区分,之后实现非客户区的鼠标拖动功能。

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)的所需代码:

 

  1. 在.h头文件,窗口类的public中声明函数:
    afx_msg LRESULT OnNcHitTest(CPoint point);//鼠标操作测试反应函数
  2. 添加消息,在.cpp文件,消息循环MAP中添加消息:
    ON_WM_NCHITTEST()//鼠标操作测试消息
  3. 在.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 在最大化按钮上。

你可能感兴趣的:(MFC对话框可拖动化)