duilib学习
記錄duilib自學過程。
最近年底公司也沒啥事情,自己就想著上網(wǎng)看看duilib怎么制作界面,因為之前想學習一直沒時間,現(xiàn)在來看看。
其實學習的就好辦法就是看demo,關于duilib網(wǎng)上的學習教程并不多,自己跟著demo敲一遍代碼大概就知道怎么回事了。我自己是下了這個demo.
里面有個duidemo工程,里面有較多控件,基于這個demo就可以修改成自己想要的界面。一邊修改一遍學習。
首先是duilib庫的引入,我個人是使用DLL的方式,什么頭文件源文件一起打包到工程里面,用DLL靜態(tài)鏈接的方式引入到win32工程中就可以了。需要引入的頭文件是 #include <UIlib.h>。編譯沒問題就可以開始了。 按照上面說的是修改duidemo的工程,直接將duidemo文件夾拷貝出來編譯下圖就是程序運行成功的界面。
可以看出里面已經(jīng)有很多控件了,那我們需要的關注的就是怎么使用這些控件以及窗口管理。
duilib的消息機制就像是MFC那樣的,具體區(qū)別我也沒太去研究,這里只關注怎么使用。先看工程里面DuiDemo.h和DuiDemo.cpp,程序入口就在DuiDemo.cpp里面,函數(shù)如下:
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int nCmdShow) // 創(chuàng)建主窗口CMainWnd* pMainWnd = new CMainWnd();if( pMainWnd == NULL ) return 0;pMainWnd->Create(NULL, _T("sqlop"), UI_WNDSTYLE_FRAME, 0L, 0, 0, 800, 572);pMainWnd->CenterWindow();上面就是創(chuàng)建主窗口的代碼,重點關注CMainWnd這個類,找到這個類的文件。duilib的窗口布局都是基于XML文件的,所以CMainWnd首先會找到自己的布局文件XML_MAIN,這里是做了映射吧,對應的XML文件時main.xml,我沒注意看,后續(xù)我自己的窗口都是用xxx.xml這種名稱加載XML布局文件的。加載布局函數(shù)是DuiLib::CDuiString GetSkinFile();可以看到里面返回了一個XML文件的名稱,你可以試試修改成其它錯誤的名稱,就會導致程序報錯,因為找不到相應的XML文件。
再來值得關注的函數(shù)還有void InitWindow();
這個函數(shù)使用了做窗口的初始化的,你可以在里面獲取到XML里面的控件對應的句柄,然后用句柄做一些相應的初始胡。比如:
控件在XML中都是或者這樣方式寫的,像上面的tree控件在XML寫為
<TreeView name="treeview" bkcolor="#ffffffff" visiblefolderbtn="true" visiblecheckbtn="false" vscrollbar="true" >獲取句柄的方式:m_pm.FindControl(_T(“樹形控件的name”))),注意使用的時候判斷一下句柄是否為空,若是返回NULL還是使用改句柄會造成程序報錯。
記獲取XML控件句柄方式:CxxxUI* myUI= static_cast<CxxxUI*>(m_pm.FindControl(_T("控件name")));
看看所有控件的父類,你都會發(fā)現(xiàn)所有控件都會繼承CControlUI類。所以,所有類都會有一些共用的方法,比如:
接下來需要關注的函數(shù)是void Notify(TNotifyUI& msg);這個函數(shù)會接收窗口的所有消息,所以我們很多響應操作都是在這里完成的。TNotifyUI& msg;包含了消息的相應類型,可以根據(jù)里面的類型進行判斷。
CDuiString name = msg.pSender->GetName();這一句是獲取到對應消息的控件的名稱,也就是XML文件里面控件的name屬性。
msg.sType;這個是消息的類型,比如單擊為if( msg.sType == _T("click") );雙擊樹形控件節(jié)點為if (msg.sType == DUI_MSGTYPE_TREEITEMDBCLICK);
#define DUI_MSGTYPE_TREEITEMDBCLICK (_T("treeitemdbclick"))在判斷消息類型的時候可以使用UIDefine.h里面的宏定義也可以直接使用字符串的形式,都是一樣的。
上面都是系統(tǒng)消息,duilib也是可以做自定義消息的。
首先要定義消息映射表。
//頭文件
//源文件
DUI_BEGIN_MESSAGE_MAP(CMainPage, CNotifyPump)DUI_END_MESSAGE_MAP()是不是覺得很熟悉,其實跟MFC的消息映射時一樣的,使用PostMessage或者SendMessage都是可以觸發(fā)消息從而跳轉(zhuǎn)到映射的函數(shù)里面,具體不做展開,可以自行百度MFC自定義消息,或者之間百度duilib自定義消息,很簡單的。
太多了,就寫到這里,還是需要自己去實踐使用才能逐漸掌握。下面是我自己做的一個數(shù)據(jù)庫查詢工具,數(shù)據(jù)庫是mysql的,所以還添加mysql的庫,因為需要導出的文件是xlsx/xls,所以還需要添加libxl庫。界面截圖。
代碼下載鏈接:https://download.csdn.net/download/qq_27731413/14675848
總結
- 上一篇: bjui刷新当前页签
- 下一篇: 细说PHP电子书pdf下载