MFC点击Dialog窗体可拖动的实现
2012-11-18 20:29
453 查看
MFC创建一个可通过鼠标点击客户区拖动窗口位置的方法
通过添加消息响应函数
afx_msg UINT OnNcHitTest(CPoint
point);
添加宏
ON_WM_NCHITTEST()
然后, 定义OnNcHitTest的行为即可,
OnNcHitTest的代码如下:
UINT CTimerDlg::OnNcHitTest(CPoint point)
{
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);
if(rect.PtInRect(point))
return HTCAPTION;
return CDialog::OnNcHitTest(point);
}
首先,
发生WM_NCHITTEST消息的时候, 程序先取得客户区的窗口矩形, 这里用到GetClientRect方法得到,
由于GetClientRect取得的是相对于窗口坐标系统, 但OnNcHitTest的参数point却是相对于屏幕的坐标系统,
所以这里用到了ClientToScreen把取到的客户区矩形转成相对于屏幕的坐标, 然后用CRect类的PtInRect方法判断point是否落在这个矩形里面,
如果是, 则返回HTCAPTION(就相当于这次点击是点击标题栏), 所以, 就可以这样来拖动窗口了. 如果,
OnNcHitTest直接返回HTCAPTION的话, 那么, 但用户点击非客户区的时候, 有些功能会失效, 比如点击系统的关闭按钮,
试一下就会发现这个按钮无效了; ok, 如果点击的是非客户端, 者直接返回CDialog::OnNcHitTest(point),
这就是按默认处理了.
以上的这个方法比较麻烦, 其实可以更简单一点, 只要先调用父类的OnNcHitTest(point), 取得返回值,
在判断是不是HTCLIENT, 如果是, 则返回HTCAPTION, 否则直接返回父类OnNcHitTest(point)的返回值就ok了,
修改后如下:
UINT CTimerDlg::OnNcHitTest(CPoint point)
{
UINT uRet = CDialog::OnNcHitTest(point);
if(HTCLIENT == uRet)
return HTCAPTION;
return uRet;
}
再简化一下, 就成这样子:
UINT CTimerDlg::OnNcHitTest(CPoint point)
{
UINT uRet = CDialog::OnNcHitTest(point);
return (HTCLIENT == uRet) ? HTCAPTION : uRet;
}
由于想收藏可是一直提示错误,就直接转载出来了!
转载自http://www.cppblog.com/jianc/archive/2012/05/11/174547.html
通过添加消息响应函数
afx_msg UINT OnNcHitTest(CPoint
point);
添加宏
ON_WM_NCHITTEST()
然后, 定义OnNcHitTest的行为即可,
OnNcHitTest的代码如下:
UINT CTimerDlg::OnNcHitTest(CPoint point)
{
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);
if(rect.PtInRect(point))
return HTCAPTION;
return CDialog::OnNcHitTest(point);
}
首先,
发生WM_NCHITTEST消息的时候, 程序先取得客户区的窗口矩形, 这里用到GetClientRect方法得到,
由于GetClientRect取得的是相对于窗口坐标系统, 但OnNcHitTest的参数point却是相对于屏幕的坐标系统,
所以这里用到了ClientToScreen把取到的客户区矩形转成相对于屏幕的坐标, 然后用CRect类的PtInRect方法判断point是否落在这个矩形里面,
如果是, 则返回HTCAPTION(就相当于这次点击是点击标题栏), 所以, 就可以这样来拖动窗口了. 如果,
OnNcHitTest直接返回HTCAPTION的话, 那么, 但用户点击非客户区的时候, 有些功能会失效, 比如点击系统的关闭按钮,
试一下就会发现这个按钮无效了; ok, 如果点击的是非客户端, 者直接返回CDialog::OnNcHitTest(point),
这就是按默认处理了.
以上的这个方法比较麻烦, 其实可以更简单一点, 只要先调用父类的OnNcHitTest(point), 取得返回值,
在判断是不是HTCLIENT, 如果是, 则返回HTCAPTION, 否则直接返回父类OnNcHitTest(point)的返回值就ok了,
修改后如下:
UINT CTimerDlg::OnNcHitTest(CPoint point)
{
UINT uRet = CDialog::OnNcHitTest(point);
if(HTCLIENT == uRet)
return HTCAPTION;
return uRet;
}
再简化一下, 就成这样子:
UINT CTimerDlg::OnNcHitTest(CPoint point)
{
UINT uRet = CDialog::OnNcHitTest(point);
return (HTCLIENT == uRet) ? HTCAPTION : uRet;
}
由于想收藏可是一直提示错误,就直接转载出来了!
转载自http://www.cppblog.com/jianc/archive/2012/05/11/174547.html
相关文章推荐
- MFC点击Dialog窗体可拖动的实现
- 点击窗体任意部分拖动窗体实现方法
- 鼠标点击非标题栏区拖动MFC对话框(OnNcHitTest函数实现)
- MFC 无边框窗体实现用鼠标拖动窗体边缘实现窗体大小变化
- MFC 客户区 模拟标题栏 功能 ,实现窗体拖动
- MFC无边框的窗体实现用鼠标拖动窗体边缘实现窗体大小变化
- activity实现dialog,点击窗体外,不消失的设置
- MFC无边框的窗体实现用鼠标拖动窗体边缘实现窗体大小变化
- MFC无边框的窗体实现用鼠标拖动窗体边缘实现窗体大小变化
- MFC无边框的窗体实现用鼠标拖动窗体边缘实现窗体大小变化
- MFC无边框的窗体实现用鼠标拖动窗体边缘实现窗体大小变化
- 在窗体上放置saveFileDialog、openFileDialog两个控件。实现功能:1)程序运行时,在文本框(注意文本框多行、带垂直滚动条)中输入汉字、字符等,单击保存按钮,即可将文本框中内容保
- MFC无边框窗体不响应任务栏点击问题
- MFC, WTL中实现文件拖动功能
- AlertDialog点击button时由于逻辑需要不关闭dialog的实现
- MFC控件随窗体大小变化的实现
- MFC CListControl 点击列头排序的实现
- 用C#实现在客户区拖动窗体
- C#实现窗体和任意控件的拖动
- WinForm实现窗体上控件的自由拖动