2011-03-18 35 views
1

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

回答

2

广泛的研究,由于对应答部门活动后,我发现有点接受(虽然不便携式)解决方案:

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消息。

0

另一便携式解决方案也许是这样的:

//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); 
    } 
} 

事实上,由约翰·洛克在一楼提到的解决方案是more建议在wxMSW,以及像Linux系统,我们可以模拟ALT按钮按下信息时,标题点击。