wxWidgets實現拖放操作

2021-07-25 20:48:41 字數 2669 閱讀 5610

剛剛從學校出來找到了乙份做c++的實習工作,安排給我的任務就是在現有系統上開發乙個演算法流程編輯模組,其中就要實現演算法模組的拖放操作。因為之前用過mfc開發過專案,所以學習其wxwidgets起來相對順手,但是其中也遇到了一些小麻煩,不過後面也都慢慢解決了。個人認為,對於新手來說,開發乙個之前沒有實現過的乙個功能沒有必要去把實現該功能所有用到的知識點全部搞懂在去動手做,由於基礎原因不一定能看的懂,所以不如去實現乙個簡單的例子,然後在去豐富完善功能。筆者沒有太多工作經驗,所以也是採用這種方式去做的,下面看看如何用wxwidgets實現拖放操作吧!

例子中主要實現的是將左邊樹形節點拖放到右邊的網格中並彈出乙個messagebox顯示樹形節點的名稱。

本文將不會按照書那樣去詳細講述實現此功能所有的知識點,筆者主要是講述拖放操作在wxwidgets中的實現流程,做乙個簡單的例子讓大家更好的去理解,如果大家想詳細了解可以去翻閱相關書籍和開發文件(東西太多,可能一時半會看不懂)。

首先,我們需要建立乙個擁有乙個wxtreectrl的控制項和乙個wxgrid的網格控制項。wxtreectrl需要繫結乙個拖放開始的事件。具體實現**如下:

wxnotebook * pnote =

new wxnotebook(this, 1001);

ptreectrl =

new wxtreectrl(pnote);

wxtreeitemid root = ptreectrl->addroot("root");

ptreectrl->connect(-

1, wxevt_tree_begin_drag,

wxtreeeventhandler(myframe::onbegindrag),null, this);//動態繫結拖拽事件

pnote->addpage(ptreectrl, "root");

wxboxsizer *sizer_top =

new wxboxsizer( wxhorizontal );

sizer_top->add(pnote, 1, wxexpand);

wxgrid * grid =

new wxgrid(this, wxid_any);

grid->creategrid(6,10);

grid->hidecollabels();

grid->hiderowlabels();

sizer_top->add(grid, 1, wxexpand);

setsizerandfit(sizer_top);

架子搭起來了,那麼如果來實現拖拽呢?

讓我們思考下,實現拖放功能都需要哪些東西?其實很簡單,我們需要乙個拖拽源、乙個存放拖拽資訊的目的地,還有乙個存放拖拽資料的資料物件。在wxwidgets中它們分別可以用wxdropsource、wxdroptarget、wxdataobject(抽象類)三個類來實現。因為我們進行是對樹形節點的名稱進行拖拽處理,所以我們可以用wxwidgets提供的wxtextdataobject存放資料,用wxtextdroptarget作為拖放目的地。

讓我們來看下wxtreectrl控制項中拖拽開始事件的處理**:

wxtreeitemid id = ptreectrl->getselection();

wxstring str = ptreectrl->getitemtext(id);//獲取選擇節點的名稱

wxtextdataobject data(str);//建立資料來源並把資料存放到物件中

wxdropsource dragsource(this);//建立資料來源 並傳入樹形控制項的指標

dragsource.setdata(data);//將資料物件設定到拖拽源中

dragsource.dodragdrop(wxdrag_allowmove);//開始拖拽

我們把拖動的節點放到網格上時,是如何知道節點已經放到網格上了呢?

這時候我們就需要wxtextdroptarget類,讓我們看看是如何使用此類的。

class treedrag :public wxtextdroptarget

//拖動源放到拖放目的地時會執行該函式 此函式重寫了基類的ondroptext

virtual

bool ondroptext(wxcoord x, wxcoord y, const wxstring& text)

private:

wxgrid * pgrid;//記錄網格控制項指標 會在ondroptext中使用,比如將節點名字新增到網格中

};

之前我們通過wxdropsource dragsource(this)將wxtreectrl控制項和拖拽源繫結在一起,那麼如何將wxtextdroptarget和wxgrid控制項繫結在一起呢?

grid->setdroptarget(new treedrag(grid));//繫結拖拽目標物件
參考材料: 《使用wxwidgets跨平台程式開發》11章 11.3小節 wxwidgets原始碼包中 samples檔案下的dnd

wxwidgets實現拖放比較詳細的文章:

檔案拖放操作

我們知道,很多程式都直接檔案拖放。例如常見的excel,word等等。如果要為我們自己的應用程式新增檔案拖放到支援,那麼可以按照如下的一些步驟完成 1.設定窗體的allowdrop屬性為true 2.編寫兩個事件 dragenter和dragdrop 以下是我的乙個小軟體中的兩段 供參考 當拖放檔案...

C Winform 拖放操作

1.textbox接受拖放的檔案 2.listbox允許使用者自定義排序 3.listbox之間的拖放 4.控制項的拖放 5.console的拖放問題 使用者在進行拖放操作時,經過的步驟大體如下 例如將a中的資料拖放的b中 滑鼠點選a中的資料 mousedown 滑鼠移動 mousemove 出源資...

在C 中快速實現拖放操作

拖放操作是乙個我比較喜歡的使用者體驗,但實現起來稍顯麻煩,這裡我將它的常用方式簡單的集合了一下,作為擴充套件方法,以便快速呼叫 static class drapdropextend c.dragdrop s,e public static void drapdrop this control c,...