MFC中混合使用Duilib制作界面
因?yàn)楣卷?xiàng)目最近入了MFC的這個(gè)大坑,用MFC做UI做了一段時(shí)間,感覺不是很方便,開發(fā)效率有點(diǎn)慢。
看了c++里面做界面的類庫(kù),感覺Duilib比較符合做界面的需求,而且很多大公司也在使用Duilib,那就隨一下大流,并在此表達(dá)對(duì)Duilib作者及廣大的開源作者的敬意。
Duilib支持win32程序及MFC程序。
?
步驟如下:
?
設(shè)置Duilib環(huán)境
可以去https://github.com/duilib/duilib下載框架,將Duilib框架在UnicodeDebug及Debug下編譯生成庫(kù)文件
下面都是VS2008的環(huán)境操作。在VC++ 選項(xiàng)->項(xiàng)目與解決方案-> VC++目錄
引入Duilib的
包含文件
庫(kù)文件
源文件
設(shè)置系統(tǒng)的環(huán)境變量
不設(shè)置環(huán)境變量的話,也可以直接把DuiLib_ud.dll及DuiLib_d.dll復(fù)制到應(yīng)用程序的生成目錄。否則會(huì)報(bào)缺少相關(guān)dll的錯(cuò)誤。
?
添加引用及dll
在stdafx.h文件中加入duilib的頭文件及庫(kù)
1 #include <ObjBase.h>2 #include <UIlib.h>3 using namespace DuiLib;4 #ifdef _DEBUG5 # ifdef _UNICODE6 # pragma comment(lib, "DuiLib_ud.lib")7 # else8 # pragma comment(lib, "DuiLib_d.lib")9 # endif 10 #else 11 # ifdef _UNICODE 12 # pragma comment(lib, "DuiLib_u.lib") 13 # else 14 # pragma comment(lib, "DuiLib.lib") 15 # endif 16 #endif?
注意:如果將生成的程序拿到其他機(jī)器上運(yùn)行,一定要復(fù)制DuiLib的相關(guān)Dll到應(yīng)用程序的根目錄。
?
?
創(chuàng)建對(duì)應(yīng)的類
?
?
創(chuàng)建一個(gè)C++類,讓這個(gè)類繼承Duilib的CWindowWnd和INotifyUI
如下所示:
?
在自己定義的類的頭文件中加上
1 public: 2 3 LPCTSTR GetWindowClassName() const; 4 5 void Notify(TNotifyUI& msg); 6 7 LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);及
private:CPaintManagerUI m_pm;?
GetWindowClassName
?
GetWindowClassName是設(shè)置類的類名稱
?
源文件可以如下定義:
1 LPCTSTR CDuiLib_Dialog::GetWindowClassName() const 2 { 3 return (LPCTSTR)"CTestDlg"; /*自己可以隨意取個(gè)名字*/ 4 }?
Notify
?
Notify是Duilib中控件的響應(yīng)函數(shù),比如說某個(gè)控件按鈕點(diǎn)擊之后的處理。
源文件可以如下定義:
1 void CDuiLib_Dialog::Notify(TNotifyUI& msg)2 {3 if( msg.sType == _T("click") )4 {5 if( msg.pSender->GetName() == _T("closebtn") )6 {7 Close();8 }9 } 10 }?
HandleMessage
?
HandleMessage是Duilib中對(duì)消息循環(huán)的消息處理函數(shù)。
可以在這個(gè)函數(shù)中對(duì)Duilib進(jìn)行初始化
源文件可以如下定義:
1 LRESULT CDuiLib_Dialog::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)2 {3 if( uMsg == WM_CREATE )4 {5 CPaintManagerUI::SetInstance(AfxGetInstanceHandle());//加載XML的時(shí)候,需要使用該句柄去定位EXE的路徑,才能加載XML的路徑6 CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath() + _T("skin"));//定位圖片等資源的位置7 8 m_pm.Init(m_hWnd);9 CDialogBuilder builder; 10 CControlUI *pRoot = builder.Create(_T("MainActivity.xml"), (UINT)0, NULL, &m_pm); //加載的XML文件的名稱 11 ASSERT(pRoot && "Failed to parse XML"); 12 m_pm.AttachDialog(pRoot); 13 m_pm.AddNotifier(this); 14 15 return 0; 16 } 17 else if( uMsg == WM_DESTROY ) 18 { 19 ::PostQuitMessage(0); 20 } 21 LRESULT lRes = 0; 22 23 if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes; 24 25 return CWindowWnd::HandleMessage(uMsg, wParam, lParam); 26 }?
?
創(chuàng)建窗體
?
在主窗體中創(chuàng)建這個(gè)Duilib,
?
在主窗體的這個(gè)類中加一個(gè)剛才增加的類對(duì)象 m_dlgDuilib(對(duì)象名隨意)
通過下面代碼創(chuàng)建
1 if(m_dlgDuilib == NULL) 2 { 3 m_dlgDuilib.Create(this->m_hWnd, NULL, UI_WNDSTYLE_DIALOG & (~( WS_BORDER | WS_CAPTION )) , 0, 0, 0, 800, 600); 4 } 5 m_dlgDuilib.CenterWindow(); 6 m_dlgDuilib.ShowWindow(TRUE);?
可以設(shè)置打開的窗體樣式為
UI_WNDSTYLE_DIALOG & (~(WS_CAPTION | WS_BORDER))?
?
設(shè)計(jì)布局及樣式
?
Duilib的窗體布局是通過xml來體現(xiàn)的,在Duilib中有一個(gè)Dui Designer,可以通過其進(jìn)行設(shè)計(jì)。關(guān)于Duilib的使用可以查看這篇文章:http://www.cnblogs.com/lin1270/p/4106944.html
?
Demo下載地址
總結(jié)
以上是生活随笔為你收集整理的MFC中混合使用Duilib制作界面的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Duilib教程-自动布局3-分隔条
- 下一篇: C/C++中调用api设置mysql连接