MFC 对话框中实现任意地方拖拽功能

来源:互联网 发布:基因组数据分析 编辑:程序博客网 时间:2024/05/19 22:50

          最近公司做一个小的客户端程序,要求用MFC可怜我一直没有好好学过MFC。导致自己狂搜一气google,baidu可是帮了大忙,还算是两天把工作要求的功能实现了。今天讲了一下后续工作安排,恐怕我有点心颤了。近期恐怕要抓紧学习MFC了。在一个好友的意见下以后也把整个项目中遇到的所有问题用blog的方式记录下来。如果有人能用得着,也算没白用心。技术么,永远都要和大家分享才更有意思。好了闲话不说了,开始正文。

做了一个对话框,想要实现拖拽功能。因为我对话框用CImage贴图贴的jpg图片,就没有标题栏了。可是不能拖拽是不行的啊。只好下功夫找了。

网上介绍了一种方法在WM_NCHITTEST(鼠标在对话框上移动就会触发这个消息)消息中处理,当鼠标移动到对话框上时,把全部对话框都强制变为Title-Bar。

afx_msg UINT OnNcHitTest(CPoint point ); 


这个是函数原型CPoint制定了当前鼠标移动的位置,返回值是一个枚举,就是当前鼠标所在区域的类型HTCAPTION 就是 Title-Bar。

所以只要在这个函数中写上如下语句就可以实现在任意位置拖拽了。

LRESULT OnNcHitTest(CPoint point){     CRect rc;     GetClientRect(&rc);     ClientToScreen(&rc);    return rc.PtInRect(point) ? HTCAPTION : CDialog::OnNcHitTest(point);}

后来这么做了以后发现一个问题,这个对话框没有办法在响应mfc中的WM_MOUSEMOVE消息了。在好友帮助下,可以用响应WM_LBUTTONDOWN的方式来进行处理。因为拖拽只是点击鼠标以后的事情,我鼠标移动完全没有必要这样。在点击鼠标按键时WM_LBUTTONDOWN消息函数中,写如下代码:

void OnLButtonDown(UINT nFlags, CPoint point){PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));  CDialog::OnLButtonDown(nFlags, point);}


PostMessage(WM_NCLBUTTONDOWN,  HTCAPTION,  MAKELPARAM(point.x,  point.y));中WM_NCLBUTTONDOWN消息是在非工作区按下鼠标左键。

函数原型是:

afx_msg void OnNcLButtonDown(   UINT nHitTest,   CPoint point ); 


一个参数就是一个枚举,说明当前工作区就是OnNcHitTest的返回值,我们只要填成HTCAPTION就相当于指定了当前鼠标在Title-Bar上。这样就满足了程序要求了。

 

原创粉丝点击