另避蹊径的处理点击客户区即可移动窗体的方法

如何让用户在点击窗体的客户区移动窗体,一般做法是重载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);
}

  

 

posted @ 2014-01-27 13:54  代码人  阅读(224)  评论(0编辑  收藏  举报