因為公司項目最近入了MFC的這個大坑,用MFC做UI做了一段時間,感覺不是很方便,開發效率有點慢。
看了c++里面做界面的類庫,感覺Duilib比較符合做界面的需求,而且很多大公司也在使用Duilib,那就隨一下大流,並在此表達對Duilib作者及廣大的開源作者的敬意。
Duilib支持win32程序及MFC程序。
步驟如下:
-
設置Duilib環境
可以去https://github.com/duilib/duilib下載框架,將Duilib框架在UnicodeDebug及Debug下編譯生成庫文件
下面都是VS2008的環境操作。在VC++ 選項->項目與解決方案-> VC++目錄
引入Duilib的
包含文件
庫文件
源文件
設置系統的環境變量
不設置環境變量的話,也可以直接把DuiLib_ud.dll及DuiLib_d.dll復制到應用程序的生成目錄。否則會報缺少相關dll的錯誤。
-
添加引用及dll
在stdafx.h文件中加入duilib的頭文件及庫
1 #include <ObjBase.h> 2 #include <UIlib.h> 3 using namespace DuiLib; 4 #ifdef _DEBUG 5 # ifdef _UNICODE 6 # pragma comment(lib, "DuiLib_ud.lib") 7 # else 8 # 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
注意:如果將生成的程序拿到其他機器上運行,一定要復制DuiLib的相關Dll到應用程序的根目錄。
-
創建對應的類
創建一個C++類,讓這個類繼承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是設置類的類名稱
源文件可以如下定義:
1 LPCTSTR CDuiLib_Dialog::GetWindowClassName() const 2 { 3 return (LPCTSTR)"CTestDlg"; /*自己可以隨意取個名字*/ 4 }
Notify
Notify是Duilib中控件的響應函數,比如說某個控件按鈕點擊之后的處理。
源文件可以如下定義:
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中對消息循環的消息處理函數。
可以在這個函數中對Duilib進行初始化
源文件可以如下定義:
1 LRESULT CDuiLib_Dialog::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) 2 { 3 if( uMsg == WM_CREATE ) 4 { 5 CPaintManagerUI::SetInstance(AfxGetInstanceHandle());//加載XML的時候,需要使用該句柄去定位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 }
-
創建窗體
在主窗體中創建這個Duilib,
在主窗體的這個類中加一個剛才增加的類對象 m_dlgDuilib(對象名隨意)
通過下面代碼創建
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);
可以設置打開的窗體樣式為
UI_WNDSTYLE_DIALOG & (~(WS_CAPTION | WS_BORDER))
-
設計布局及樣式
Duilib的窗體布局是通過xml來體現的,在Duilib中有一個Dui Designer,可以通過其進行設計。關於Duilib的使用可以查看這篇文章:http://www.cnblogs.com/lin1270/p/4106944.html
Demo下載地址