1 系统标题栏窗口拖动的实现
当鼠标在窗口内移动,点击或者释放时都会产生WM_NCHITTEST消息,响应函数OnNcHitTest会返回一个枚举值,mfc会根据这个枚举值进行相应的处理
当返回值为HTCAPTION时,mfc会认为此时鼠标位于标题栏上,因而当鼠标按下并移动时就会执行拖动操作.
2 非系统标题栏窗口拖动的实现
由1可知,只要我们重载OnNcHitTest函数,使鼠标在指定区域按下并拖动时OnNcHitTest函数返回HTCAPTION就可以实现窗口的拖动.
3 实现代码
1)如果mfc程序是基于对话框的,在对话框类中添加OnNcHitTest消息处理函数,并添加如下代码
LRESULT Cxxx::OnNcHitTest(CPoint point) {
CRect rc;
GetClientRect(&rc);
ClientToScreen(&rc);
int x=point.x;
int y=point.y;
if (x>rc.left && x<rc.right-xxx && y>rc.top && y<rc.top+xxx) {
return HTCAPTION;
}
return CFrameWnd::OnNcHitTest(point);
}
其中的"xxx"表示任意的字符,在实际使用中需要根据情况进行修改(消息处理函数需要添加消息映射,建议使用向导来完成,以后相同情况不在进行说明)
这样在指定区域按下鼠标左键并移动就可以实现窗口拖动了.
2)如果mfc程序是基于文档/视图的,需要在主窗口类中进行与上面相同的操作,并在视图类中也添加OnNcHitTest消息处理函数,并添加如下代码
LRESULT Cxxx::OnNcHitTest(CPoint point) {
CRect rc;
GetClientRect(&rc);
ClientToScreen(&rc);
int x=point.x;
int y=point.y;
if (x>rc.left && x<rc.right-xxx &&
y>rc.top && y<rc.top+xxx) {
return HTTRANSPARENT;
}
return CView::OnNcHitTest(point);
}
由于已经在视图类中的OnNcHitTest函数中进行了可拖动区域的判断,所以主窗口类中的OnNcHitTest函数不用在进行同样的判断,代码如下
LRESULT Cxxx::OnNcHitTest(CPoint point) {
return HTCAPTION;
}
其他
相关函数的作用,请查阅MSN文档
以上内容属于个人理解,仅供参考,不保证正确. 如果发现错误或有建议请与我联系,谢谢.
email: linjieligc@qq.com
qq:914196158
程序设计交流群:250967270