欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

wxWidgets實現(xiàn)無標題欄窗口拖動效果

 更新時間:2019年02月20日 11:45:32   作者:zfwjsjzy  
這篇文章主要為大家詳細介紹了wxWidgets實現(xiàn)無標題欄窗口拖動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了wxWidgets實現(xiàn)無標題欄窗口拖動的具體代碼,供大家參考,具體內容如下

最近需要做一個自定義的標題欄,而其中最重要的就是要實現(xiàn)窗口的拖動。默認情況下有標題欄,都可以通過拖動系統(tǒng)默認的標題欄,但是自定義的標題欄需要自己實現(xiàn)拖動。

實現(xiàn)無標題窗口的拖動,在MFC中可以在鼠標在窗口中拖動時,發(fā)送虛假的消息給窗口來進行實現(xiàn)(注:MFC可以發(fā)送鼠標在標題欄拖動的消息)。但是在wxWidgets中,暫時沒有看到類似的消息。因工作需要,才學習wxWidgets不久。如果有知道相關消息的朋友,請發(fā)消息告訴。而自己實現(xiàn)拖動,大致可以分為三個步驟。

1、在鼠標左鍵按下時,記錄下鼠標位置,使用CaptureMouse來進行鼠標捕獲 。注意,這里如果不捕獲鼠標,那么也能實現(xiàn)拖動窗口,但是會出現(xiàn)一個小問題,就是當鼠標在窗口邊緣快速的拖出窗口的時候,窗口不能進行移動。因為系統(tǒng)對鼠標的移動事件的發(fā)送是有事件間隔的,窗口收到該消息時鼠標已經(jīng)離開了窗口,所以不能正確拖動。一定要記得設置鼠標捕獲。

2、當鼠標拖動的時候(在鼠標事件中判斷鼠標左鍵按下且在拖拽),計算鼠標新的位置相對之前的位移向量,并移動窗口到相應的位置。

3、處理鼠標左鍵抬起事件,在鼠標抬起事件中使用ReleaseMouse來釋放之前捕獲的鼠標。

4、處理EVT_MOUSE_CAPTURE_LOST(func)事件,在其中釋放鼠標捕獲。官方文檔有說明,對鼠標進行捕獲必須處理該事件,并在其中釋放鼠標捕獲。因為彈出對話框等情況會導致鼠標是按下的,但是父窗口卻失去了鼠標焦點的狀況,所以必須處理該事件釋放鼠標。

下面給出我自己實現(xiàn)的一個可以通過鼠標拖拽實現(xiàn)移動的無標題欄窗口的代碼,可以對照上邊的介紹看一下具體的實現(xiàn)。這個類實現(xiàn)的是拖動自己,當然可以利用在計算坐標之后獲取父窗口來進行移動,那樣就可以實現(xiàn)鼠標在子窗口上拖動來實現(xiàn)整個窗口的移動。也就是自定義的標題欄應該具有的基本功能。

頭文件: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();
}

好了,最后貼出效果圖。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關文章

  • c語言實現(xiàn)冒泡排序、希爾排序等多種算法示例

    c語言實現(xiàn)冒泡排序、希爾排序等多種算法示例

    c語言實現(xiàn)插入排序、冒泡排序、選擇排序、快速排序、堆排序、歸并排序、希爾排序示例,需要的朋友可以參考下
    2014-04-04
  • 深入淺析C語言與C++的區(qū)別與聯(lián)系

    深入淺析C語言與C++的區(qū)別與聯(lián)系

    這篇文章主要為大家介紹了深入的分析了C語言與C++的區(qū)別與聯(lián)系,文中通過詳細的示例進行了對比,以便大家更容易的看懂理解,有需要的朋友可以借鑒參考下
    2021-11-11
  • OpenCV霍夫變換(Hough Transform)直線檢測詳解

    OpenCV霍夫變換(Hough Transform)直線檢測詳解

    這篇文章主要為大家詳細介紹了OpenCV霍夫變換直線檢測的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 純C語言:檢索與周游廣度深度遍歷源碼分享

    純C語言:檢索與周游廣度深度遍歷源碼分享

    這篇文章主要介紹了檢索與周游廣度深度遍歷源碼,有需要的朋友可以參考一下
    2014-01-01
  • C語言函數(shù)調用基礎應用詳解

    C語言函數(shù)調用基礎應用詳解

    函數(shù)就是一段封裝好的,可以重復使用的代碼,它使得我們的程序更加模塊化,不需要編寫大量重復的代碼。這篇文章主要介紹了c語言是如何處理函數(shù)調用的?需要的朋友可以參考下
    2023-02-02
  • 你真的懂C++中的namespace用法

    你真的懂C++中的namespace用法

    命名空間(namespace)為防止名字沖突提供了更加可控的機制,命名空間分割了全局命名空間,其中每個命名空間是一個作用域,今天通過本文給大家分享C++中namespace用法,感興趣的朋友一起看看吧
    2021-06-06
  • 用C語言來實現(xiàn)一個簡單的虛擬機

    用C語言來實現(xiàn)一個簡單的虛擬機

    這篇文章主要介紹了用C語言來實現(xiàn)一個簡單的虛擬機,其中棧數(shù)組的部分非常值得學習,需要的朋友可以參考下
    2015-07-07
  • MFC實現(xiàn)簡單計算器

    MFC實現(xiàn)簡單計算器

    這篇文章主要為大家詳細介紹了MFC實現(xiàn)簡單的計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C語言實現(xiàn)簡易通訊錄(靜態(tài)版本)的代碼分享

    C語言實現(xiàn)簡易通訊錄(靜態(tài)版本)的代碼分享

    這篇文章主要為大家詳細介紹了如何錄音C語言實現(xiàn)一個簡易的通訊錄(靜態(tài)版本),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-10-10
  • C語言實現(xiàn)的猴子吃桃問題算法解決方案

    C語言實現(xiàn)的猴子吃桃問題算法解決方案

    這篇文章主要介紹了C語言實現(xiàn)的猴子吃桃問題解決方案,較為詳細的分析了猴子吃桃問題并給出了C語言算法的實現(xiàn)方法,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-10-10

最新評論