MFC中混合使用Duilib制作界面


因為公司項目最近入了MFC的這個大坑,用MFC做UI做了一段時間,感覺不是很方便,開發效率有點慢。

看了c++里面做界面的類庫,感覺Duilib比較符合做界面的需求,而且很多大公司也在使用Duilib,那就隨一下大流,並在此表達對Duilib作者及廣大的開源作者的敬意。

Duilib支持win32程序及MFC程序。

 

步驟如下:

 

  1. 設置Duilib環境

可以去https://github.com/duilib/duilib下載框架,將Duilib框架在UnicodeDebug及Debug下編譯生成庫文件

下面都是VS2008的環境操作。在VC++ 選項->項目與解決方案-> VC++目錄

引入Duilib的

包含文件

庫文件

源文件

設置系統的環境變量

不設置環境變量的話,也可以直接把DuiLib_ud.dll及DuiLib_d.dll復制到應用程序的生成目錄。否則會報缺少相關dll的錯誤。

 

  1. 添加引用及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到應用程序的根目錄。

 

 

  1. 創建對應的類

 

 

創建一個C++類,讓這個類繼承Duilib的CWindowWndINotifyUI

如下所示:

 

在自己定義的類的頭文件中加上

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 }

 

 

  1. 創建窗體

 

在主窗體中創建這個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))

 

 

  1. 設計布局及樣式

 

Duilib的窗體布局是通過xml來體現的,在Duilib中有一個Dui Designer,可以通過其進行設計。關於Duilib的使用可以查看這篇文章:http://www.cnblogs.com/lin1270/p/4106944.html

 

Demo下載地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM