wxWidgets實(shí)現(xiàn)無標(biāo)題欄窗口拖動(dòng)效果
本文實(shí)例為大家分享了wxWidgets實(shí)現(xiàn)無標(biāo)題欄窗口拖動(dòng)的具體代碼,供大家參考,具體內(nèi)容如下
最近需要做一個(gè)自定義的標(biāo)題欄,而其中最重要的就是要實(shí)現(xiàn)窗口的拖動(dòng)。默認(rèn)情況下有標(biāo)題欄,都可以通過拖動(dòng)系統(tǒng)默認(rèn)的標(biāo)題欄,但是自定義的標(biāo)題欄需要自己實(shí)現(xiàn)拖動(dòng)。
實(shí)現(xiàn)無標(biāo)題窗口的拖動(dòng),在MFC中可以在鼠標(biāo)在窗口中拖動(dòng)時(shí),發(fā)送虛假的消息給窗口來進(jìn)行實(shí)現(xiàn)(注:MFC可以發(fā)送鼠標(biāo)在標(biāo)題欄拖動(dòng)的消息)。但是在wxWidgets中,暫時(shí)沒有看到類似的消息。因工作需要,才學(xué)習(xí)wxWidgets不久。如果有知道相關(guān)消息的朋友,請發(fā)消息告訴。而自己實(shí)現(xiàn)拖動(dòng),大致可以分為三個(gè)步驟。
1、在鼠標(biāo)左鍵按下時(shí),記錄下鼠標(biāo)位置,使用CaptureMouse來進(jìn)行鼠標(biāo)捕獲 。注意,這里如果不捕獲鼠標(biāo),那么也能實(shí)現(xiàn)拖動(dòng)窗口,但是會(huì)出現(xiàn)一個(gè)小問題,就是當(dāng)鼠標(biāo)在窗口邊緣快速的拖出窗口的時(shí)候,窗口不能進(jìn)行移動(dòng)。因?yàn)橄到y(tǒng)對(duì)鼠標(biāo)的移動(dòng)事件的發(fā)送是有事件間隔的,窗口收到該消息時(shí)鼠標(biāo)已經(jīng)離開了窗口,所以不能正確拖動(dòng)。一定要記得設(shè)置鼠標(biāo)捕獲。
2、當(dāng)鼠標(biāo)拖動(dòng)的時(shí)候(在鼠標(biāo)事件中判斷鼠標(biāo)左鍵按下且在拖拽),計(jì)算鼠標(biāo)新的位置相對(duì)之前的位移向量,并移動(dòng)窗口到相應(yīng)的位置。
3、處理鼠標(biāo)左鍵抬起事件,在鼠標(biāo)抬起事件中使用ReleaseMouse來釋放之前捕獲的鼠標(biāo)。
4、處理EVT_MOUSE_CAPTURE_LOST(func)事件,在其中釋放鼠標(biāo)捕獲。官方文檔有說明,對(duì)鼠標(biāo)進(jìn)行捕獲必須處理該事件,并在其中釋放鼠標(biāo)捕獲。因?yàn)閺棾鰧?duì)話框等情況會(huì)導(dǎo)致鼠標(biāo)是按下的,但是父窗口卻失去了鼠標(biāo)焦點(diǎn)的狀況,所以必須處理該事件釋放鼠標(biāo)。
下面給出我自己實(shí)現(xiàn)的一個(gè)可以通過鼠標(biāo)拖拽實(shí)現(xiàn)移動(dòng)的無標(biāo)題欄窗口的代碼,可以對(duì)照上邊的介紹看一下具體的實(shí)現(xiàn)。這個(gè)類實(shí)現(xiàn)的是拖動(dòng)自己,當(dāng)然可以利用在計(jì)算坐標(biāo)之后獲取父窗口來進(jìn)行移動(dòng),那樣就可以實(shí)現(xiàn)鼠標(biāo)在子窗口上拖動(dòng)來實(shí)現(xiàn)整個(gè)窗口的移動(dòng)。也就是自定義的標(biāo)題欄應(yīng)該具有的基本功能。
頭文件:MyTitleWnd.h
#pragma once #include <wx/wx.h> class MyTitleWnd:public wxFrame { public: MyTitleWnd(wxWindow *parent,wxWindowID id=wxID_ANY); virtual ~MyTitleWnd(); void OnMouseMove(wxMouseEvent& event); void OnMouseLeave(wxMouseEvent& event); void OnMouseLDown(wxMouseEvent& event); void OnMouseLUp(wxMouseEvent& event); void OnMouseCaptureLost(wxMouseCaptureLostEvent& event); private: wxPoint mLastPt; wxString mText; DECLARE_EVENT_TABLE() };
源文件:MyTitleWnd.cpp
#include "MyTitleWnd.h" BEGIN_EVENT_TABLE(MyTitleWnd, wxFrame) EVT_MOUSE_CAPTURE_LOST(MyTitleWnd::OnMouseCaptureLost) //EVT_LEFT_DOWN(MyTitleWnd::OnMouseLDown) EVT_LEFT_UP(MyTitleWnd::OnMouseLUp) EVT_MOUSE_EVENTS(MyTitleWnd::OnMouseMove) EVT_LEAVE_WINDOW(MyTitleWnd::OnMouseLeave) END_EVENT_TABLE() MyTitleWnd::MyTitleWnd(wxWindow *parent, wxWindowID id/*=wxID_ANY*/) :wxFrame(parent, id,"", wxDefaultPosition, wxDefaultSize, wxBORDER_NONE) { } MyTitleWnd::~MyTitleWnd() { } void MyTitleWnd::OnMouseMove(wxMouseEvent &event) { if(event.LeftIsDown()&&event.Dragging()) { wxPoint pt = event.GetPosition(); wxPoint wndLeftTopPt = GetPosition(); int distanceX = pt.x - mLastPt.x; int distanceY = pt.y - mLastPt.y; wxPoint desPt; desPt.x = distanceX + wndLeftTopPt.x; desPt.y = distanceY + wndLeftTopPt.y; this->Move(desPt); } if (event.LeftDown()) { this->CaptureMouse(); mLastPt = event.GetPosition(); } } void MyTitleWnd::OnMouseLeave(wxMouseEvent& event) { if (event.LeftIsDown() && event.Dragging()) { wxPoint pt = event.GetPosition(); wxPoint wndLeftTopPt = GetPosition(); int distanceX = pt.x - mLastPt.x; int distanceY = pt.y - mLastPt.y; wxPoint desPt; desPt.x = distanceX + wndLeftTopPt.x; desPt.y = distanceY + wndLeftTopPt.y; this->Move(desPt); } } void MyTitleWnd::OnMouseLDown(wxMouseEvent& event) { this->CaptureMouse(); } void MyTitleWnd::OnMouseLUp(wxMouseEvent& event) { if (HasCapture()) ReleaseMouse(); } void MyTitleWnd::OnMouseCaptureLost(wxMouseCaptureLostEvent& event) { if (HasCapture()) ReleaseMouse(); }
好了,最后貼出效果圖。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:一張圖總結(jié)C++中關(guān)于指針的那些事
欄 目:C語言
本文標(biāo)題:wxWidgets實(shí)現(xiàn)無標(biāo)題欄窗口拖動(dòng)效果
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/449.html
您可能感興趣的文章
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解
- 01-10使用OpenGL實(shí)現(xiàn)3D立體顯示的程序代碼
- 01-10求斐波那契(Fibonacci)數(shù)列通項(xiàng)的七種實(shí)現(xiàn)方法
- 01-10C語言 解決不用+、-、&#215;、&#247;數(shù)字運(yùn)算符做加法
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10fatal error LNK1104: 無法打開文件“l(fā)ibc.lib”的解決方法
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10深入全排列算法及其實(shí)現(xiàn)方法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10用C語言實(shí)現(xiàn)單鏈表的各種操作(一)


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?