我在Visual C ++ 2010中使用wxWidgets
我的目标之一是能够移动我用窗口的任何部分(客户端或其他)创建的框架。为此,我过去使用过WM_NCHITTEST来欺骗Windows认为我窗口的每个部分都是标题栏。
应该如何在wxWidgets中完成?
答案 0 :(得分: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消息。
答案 1 :(得分: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楼提到的解决方案是在{wxMSW中建议more
,在linux系统中我们可以在点击标题时模拟ALT BUTTON DOWN消息。