日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

MFC中混合使用Duilib制作界面

發(fā)布時(shí)間:2024/4/11 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC中混合使用Duilib制作界面 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

因?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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。