另避蹊径的处理点击客户区即可移动窗体的方法
如何让用户在点击窗体的客户区移动窗体,一般做法是重载WM_NCHITTEST,返回HTCAPTION。但这种方式会带来一个问题:没有了鼠标右键功能。
这里介绍一种方法,即可已在客户区移动窗体又可以实现鼠标右键功能。又可以保证右键功能功能正常。在LButtonDown的时候,发送Post消息,PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));这样做的目的是告诉系统,我点击了非客户区,然后在RButtonDown的时候,就可以任意处理了。
程序运行效果图如下所示:
核心代码如下所示,如需要完整代码,请从附件中下载:
//响应LButtonDown void CDlgDlg::OnLButtonDown(UINT nFlags, CPoint point) { //通过Post消息告诉窗体WM_NCLBUTTONDOWN PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y)); CDialog::OnLButtonDown(nFlags, point); }
以下是右键的处理,弹出Popup菜单,以测试是否真的可行:
void CDlgDlg::OnRButtonDown(UINT nFlags, CPoint point) { CMenu menu,*sub; menu.LoadMenu(IDR_MENU1); sub=menu.GetSubMenu(0); ClientToScreen(&point); sub->TrackPopupMenu(TPM_RIGHTBUTTON,point.x,point.y,this); CDialog::OnRButtonDown(nFlags, point); }