wxWidgets和WM_NCHITTEST

我在Visual C ++ 2010中使用wxWidgets。
我的目标之一是能够移动我创build的窗口的任何部分(客户端或其他)。 为了这个目的,我过去用WM_NCHITTEST来欺骗Windows,认为我的窗口的每个部分都是标题栏。
wxWidgets应该怎么做?

    经过广泛的研究,由于答复部门的不活动,我发现了一个可以接受的(虽然不是便携式的)解决方案:

    WXLRESULT [your-wxWindow-inheriting-objectname-here]::MSWWindowProc(WXUINT message,WXWPARAM wParam,WXLPARAM lParam) { if(message==WM_NCHITTEST) { return HTCAPTION; } return wxFrame::MSWWindowProc(message,wParam,lParam); } 

    这可以用于任何WINAPI消息。

    另一种便携式解决方案可能是这样

     //assume your frame named wxUITestFrame //headers class wxUITestFrame : public wxFrame { DECLARE_EVENT_TABLE() protected: void OnMouseMove(wxMouseEvent& event); void OnLeftMouseDown(wxMouseEvent& event); void OnLeftMouseUp(wxMouseEvent& event); void OnMouseLeave(wxMouseEvent& event); private: bool m_isTitleClicked; wxPoint m_mousePosition; //mouse position when title clicked }; //cpp BEGIN_EVENT_TABLE(wxUITestFrame, wxFrame) EVT_MOTION(wxUITestFrame::OnMouseMove) EVT_LEFT_DOWN(wxUITestFrame::OnLeftMouseDown) EVT_LEFT_UP(wxUITestFrame::OnLeftMouseUp) EVT_LEAVE_WINDOW(wxUITestFrame::OnMouseLeave) END_EVENT_TABLE() void wxUITestFrame::OnMouseMove( wxMouseEvent& event ) { if (event.Dragging()) { if (m_isTitleClicked) { int x, y; GetPosition(&x, &y); //old window position int mx, my; event.GetPosition(&mx, &my); //new mouse position int dx, dy; //changed mouse position dx = mx - m_mousePosition.x; dy = my - m_mousePosition.y; x += dx; y += dy; Move(x, y); //move window to new position } } } void wxUITestFrame::OnLeftMouseDown( wxMouseEvent& event ) { if (event.GetY() <= 40) //40 is the height you want to set for title bar { m_isTitleClicked = true; m_mousePosition.x = event.GetX(); m_mousePosition.y = event.GetY(); } } void wxUITestFrame::OnLeftMouseUp( wxMouseEvent& event ) { if (m_isTitleClicked) { m_isTitleClicked = false; } } void wxUITestFrame::OnMouseLeave( wxMouseEvent& event ) { //if mouse dragging too fase, we will not get mouse move event //instead of mouse leave event here. if (m_isTitleClicked) { int x, y; GetPosition(&x, &y); int mx, my; event.GetPosition(&mx, &my); int dx, dy; dx = mx - m_mousePosition.x; dy = my - m_mousePosition.y; x += dx; y += dy; Move(x, y); } } 

    实际上,John Locke在1楼提到的解决方案在wxMSW中more提示,而在linux系统中,我们可以在标题被点击时模拟ALT BUTTON DOWN消息。