Visual C++ 2010에서 wxWidgets을 사용하고 있습니다.
내 목표 중 하나는 창 (클라이언트 또는 기타)의 일부로 만든 프레임을 이동할 수 있다는 것입니다. 이를 위해 WM_NCHITTEST를 사용하여 윈도우를 속여서 윈도우의 모든 부분을 제목 표시 줄로 생각했습니다.
wxWidgets에서 어떻게해야합니까?wxWidgets 및 WM_NCHITTEST
1
A
답변
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 버튼 메시지를 시뮬레이션 할 수 있습니다 클릭 함.