MFC可拖动按钮
想要实现一个可拖动的按钮,就像拖动标题栏一样拖动主窗口(按钮父窗口)。
记录鼠标状态是否是按下,如果是则在鼠标移动的同时向父窗口发送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);; }