MFC可拖动按钮

参考:http://download.csdn.net/download/zhuyf87/6859133

想要实现一个可拖动的按钮,就像拖动标题栏一样拖动主窗口(按钮父窗口)。

记录鼠标状态是否是按下,如果是则在鼠标移动的同时向父窗口发送WM_NCLBUTTONDOWN消息。可是却发现鼠标只能响应拖动消息,却不能响应按下消息。

通过参考上面的实例程序,发现需要在响应拖动函数中调用系统API :

ReleaseCapture();

 

这样的效果是按钮响应拖动之后会忽略点击消息,如果想在拖动之前先出现点击效果可以在ReleaseCapture()之前向自身发送WM_LBUTTONUP消息。

 

关键代码:

virtual LRESULT WindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam)
{
    switch(nMsg){
    case WM_LBUTTONDOWN:
        m_bMouseDown = true;
        break;
    case WM_LBUTTONUP:
        m_bMouseDown = false;
        break;
    case WM_MOUSEMOVE:
        if(m_bMouseDown){
            SendMessage(WM_LBUTTONUP,wParam, lParam);
            ReleaseCapture();
            POINT pt = {GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)};
            ClientToScreen(&pt);
            ::PostMessage(GetTopWnd(),WM_NCLBUTTONDOWN, HTCAPTION, MAKELONG(pt.x, pt.y));
        }
        break;
        
    }
    return __super::WindowProc(nMsg, wParam, lParam);;
}

 

posted @ 2014-02-12 11:39  ssp1024  阅读(1256)  评论(0编辑  收藏  举报