我在Visual C++ 2010中使用了wxWidgets。
我的目標之一是能夠移動我用窗口的任何部分(客戶端或其他)創建的框架。爲此,我在過去使用過WM_NCHITTEST來欺騙Windows,認爲我的窗口的每個部分都是標題欄。
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);
}
}
事實上,由約翰·洛克在一樓提到的解決方案是more
建議在wxMSW,以及像Linux系統,我們可以模擬ALT按鈕按下信息時,標題點擊。
相關問題
- 1. WM_NCHITTEST,HTCAPTION和最大化窗口
- 2. Wxwidgets和Pyqt
- 3. CMake和wxWidgets 2.9.5
- 4. wxWidgets和Golang
- 5. wxWidgets和boost :: thread?
- 6. WxWidgets和STL向量
- 7. 使用wxWidgets和Unicode
- 8. 外觀和wxWidgets的
- 9. 混合WxWidgets和GTK +
- 10. 的wxWidgets和線程
- 11. wxWidgets和日誌記錄
- 12. wxWidgets和鎖定資源
- 13. QMake和wxWidgets(外部庫)
- 14. 從wxWidgets和C++開始
- 15. tkinter和wxWidgets的利弊?
- 16. wxWidgets和上下文菜單
- 17. wxwidgets的mainloop()和boost :: thread
- 18. 在標題欄上未收到WM_NCHitTest
- 19. WM_NCHITTEST不改變鼠標光標
- 20. WM_NCHITTEST不工作在WS_EX_LAYERED形式
- 21. 獲取WM_NCHITTEST消息的座標?
- 22. WM_NCHITTEST和主顯示器左邊的輔助顯示器
- 23. wxtooltip wxwidgets
- 24. wxWidgets wxBitmap
- 25. wxWidgets 2.8 to wxWidgets 2.9:wxLocale問題
- 26. 繪圖區使用wxWidgets和FormBuilder
- 27. wxWidgets的:上多wxTextCtrl和工藝TAB SetHint()
- 28. 的wxWidgets wxBORDER_NONE和wxRESIZE_BORDER使白色區域
- 29. Ubuntu中的wxWidgets和X11問題?
- 30. C++,包括使用的wxWidgets和OpenGL