2011-03-18 4 views
1

Visual C++ 2010에서 wxWidgets을 사용하고 있습니다.
내 목표 중 하나는 창 (클라이언트 또는 기타)의 일부로 만든 프레임을 이동할 수 있다는 것입니다. 이를 위해 WM_NCHITTEST를 사용하여 윈도우를 속여서 윈도우의 모든 부분을 제목 표시 줄로 생각했습니다.
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); 
    } 
} 

사실, 1 층에서 존 로크에 의해 언급 된 솔루션입니다 more이 wxMSW에서 제안하고, 제목이 때 시스템과 같은 리눅스에서 우리가 ALT의 DOWN 버튼 메시지를 시뮬레이션 할 수 있습니다 클릭 함.