VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 11778|回复: 123

[分享] 在MFC中使用Duilib界面库

  [复制链接]
51_avatar_middle
online_admins 发表于 2015-10-28 09:47:59 | 显示全部楼层 |阅读模式
Duilib是一个优秀的界面库,轻量、功能强大。MFC历史悠久,资源丰富,同时以往很多项目也是基于MFC的,要是项目太大也不是那么好转换。那么,要是我们将这两者结合起来,取长补短那不是件美事。好,下面我们就将二者结合在一起。

先上效果图:
在MFC中使用Duilib界面库

1、下载Duilib,下载地址为:https://github.com/duilib/duilib 直接下载或是通过 git 或 svn 下载,具体我就不用我说了。
2、新建一个MFC对话框项目,配置项目相关参数,具体请参考示例程序,在对话框中添加添加如下控件。

在MFC中使用Duilib界面库

3、从 WindowImplBase 继承一个类,其实就是一个窗口类,只是这里将它做为子窗口使用。
  1. #pragma once

  2. using namespace DuiLib;

  3. class MainWnd : public WindowImplBase
  4. {
  5. public:
  6.         MainWnd();
  7.         ~MainWnd();

  8.         virtual LPCTSTR GetWindowClassName(void) const;
  9.         virtual CDuiString GetSkinFolder();
  10.         virtual CDuiString GetSkinFile();
  11.         virtual void InitWindow();
  12.         virtual void Notify(DuiLib::TNotifyUI& msg);
  13.         virtual HWND Subclass(HWND hWnd);

  14. protected:
  15.         void AfterSubClassWnd();

  16. private:
  17.         DuiLib::CWebBrowserUI *m_pBrowser;  //浏览器控件
  18. };
复制代码


值得注意的 virtual HWND Subclass(HWND hWnd); 这个函数完成了子类化的功能,在 void AfterSubClassWnd() 中完成了 Duilib 皮肤资源的加载和功建的创建。至于消息处理是通过控件的 WndProc 进行消息转发,将鼠标键盘等消息转发到Duilib的相关控件。

4、编写皮肤文件,具体参与示例中的 MainWnd.xml。
  1. <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
  2. <Window>
  3.   <Font id="0" name="宋体" size="16" bold="false" italic="false" />
  4.   <Font id="1" name="宋体" size="24" bold="false" italic="false" />
  5.   <VerticalLayout bkimage="images/bkimage.png">
  6.         <Label text="这是一个Duilib做的控件" padding="0,10,0,0" font="1" align="center vcenter" textcolor="#ffff0000" />
  7.         <Button name="btn_test" text="按扭-点我" textcolor="#ffffffff" hottextcolor="#ffeeeeee" padding="10,0,0,0" font="0" width="121" height="52" normalimage="images/btn_normal.png" hotimage="images/btn_hot.png" />
  8.         <WebBrowser name="web_browser" padding="10,10,10,10" usecustomdochost="false" clsid="{8856F961-340A-11D0-A96B-00C04FD705A2}" delaycreate="false"/>
  9.   </VerticalLayout>
  10. </Window>
复制代码


//////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:https://www.cctry.com/thread-258597-1-1.html
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
//////////////////////////////////////////////////////////////////////////////////

5、在对话框添加一个控件的成员变量,在对话框初始化函数 OnInitDialog() 中对控件进行子类化,也就是规换控件的窗口过程为 Duilib 控件的窗口过程。
  1. class CMFCDuilibTestDlg : public CDialog
  2. {
  3. public:
  4.         CMFCDuilibTestDlg(CWnd* pParent = NULL);       
  5.         enum { IDD = IDD_MFCDUILIBTEST_DIALOG };

  6.         protected:
  7.         virtual void DoDataExchange(CDataExchange* pDX);       

  8. protected:
  9.         HICON m_hIcon;
  10.         MainWnd m_duiControl;
  11.         //........
  12. }

  13. BOOL CMFCDuilibTestDlg::OnInitDialog()
  14. {
  15.         CDialog::OnInitDialog();

  16.         ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  17.         ASSERT(IDM_ABOUTBOX < 0xF000);

  18.         CMenu* pSysMenu = GetSystemMenu(FALSE);
  19.         if (pSysMenu != NULL)
  20.         {
  21.                 BOOL bNameValid;
  22.                 CString strAboutMenu;
  23.                 bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  24.                 ASSERT(bNameValid);
  25.                 if (!strAboutMenu.IsEmpty())
  26.                 {
  27.                         pSysMenu->AppendMenu(MF_SEPARATOR);
  28.                         pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  29.                 }
  30.         }

  31.         SetIcon(m_hIcon, TRUE);               
  32.         SetIcon(m_hIcon, FALSE);       

  33.         m_duiControl.Subclass(GetDlgItem(IDC_DUISTATIC)->GetSafeHwnd());

  34.         return TRUE;
  35. }
复制代码


6、在 MainWnd 的 InitWindow 中添加相关初始化操作。
  1. void MainWnd::InitWindow()
  2. {
  3.         m_pBrowser=static_cast<CWebBrowserUI*>(m_PaintManager.FindControl(_T("web_browser")));
  4.         assert(m_pBrowser);

  5.         if (m_pBrowser)
  6.                 m_pBrowser->Navigate2(_T("http://www.2345.com/?k85472485"));
  7. }
复制代码


7、在 MainWnd 的 Notify 中进行相关事件处理。
  1. void MainWnd::Notify(TNotifyUI& msg)
  2. {
  3.         if( msg.sType == _T("click") )
  4.         {
  5.                 if( msg.pSender->GetName() == _T("btn_test") )
  6.                 {
  7.                         AfxMessageBox(_T("你点击了duilib中的按扭"));
  8.                 }
  9.         }
  10. }
复制代码


8、编译运行程序。

细节的地方未能仔细说明,如有不明请参考示例程序。
示例代码下载【回复后可见】
游客,如果您要查看本帖隐藏内容请回复




本篇文章作者:

论坛ID:xunonxyz

现已投稿到vc驿站,欢迎大家的品鉴!


本篇文章已被采纳为原创作品,请作者联系客服邮箱 service@cctry.com 获取奖励!

本次活动说明详见:https://www.cctry.com/thread-59248-1-1.html





上一篇:juce中使用中文
下一篇:Huffman encode
66_avatar_middle
在线会员 发表于 2015-10-28 10:28:09 | 显示全部楼层
支持楼主、、、、、
24_avatar_middle
在线会员 发表于 2015-10-28 16:47:53 | 显示全部楼层
这个文章非常好,学习了
16_avatar_middle
在线会员 发表于 2015-10-28 17:48:08 | 显示全部楼层
多谢楼主分享
17_avatar_middle
在线会员 发表于 2015-10-28 21:01:49 | 显示全部楼层
楼主辛苦了
32_avatar_middle
online_vip 发表于 2015-10-28 23:15:14 | 显示全部楼层
支持楼主、、、、、
02_avatar_middle
在线会员 发表于 2015-10-29 08:00:41 | 显示全部楼层
界面很好看,支持楼主
08_avatar_middle
在线会员 发表于 2015-10-29 08:07:06 | 显示全部楼层

楼主辛苦了
14_avatar_middle
在线会员 发表于 2015-10-29 08:48:51 | 显示全部楼层
在MFC中使用Duilib界面库谢谢
49_avatar_middle
online_vip 发表于 2015-10-29 08:50:09 | 显示全部楼层
满血复活
95_avatar_middle
在线会员 发表于 2015-10-29 09:18:26 | 显示全部楼层
支持老大
92_avatar_middle
online_vip 发表于 2015-10-29 10:12:12 | 显示全部楼层
支持老大,看看!
92_avatar_middle
online_vip 发表于 2015-10-29 10:12:29 | 显示全部楼层
支持老大,看看!
24_avatar_middle
在线会员 发表于 2015-10-29 14:59:42 | 显示全部楼层
赞一个,学习学习。
83_avatar_middle
online_vip 发表于 2015-10-30 09:12:28 | 显示全部楼层

这个文章非常好,学习了
96_avatar_middle
在线会员 发表于 2015-10-31 20:00:40 | 显示全部楼层
这个像是金山用的开源界面库
83_avatar_middle
在线会员 发表于 2015-10-31 21:02:04 | 显示全部楼层
这库很不稳定的,不能商业应用。
25_avatar_middle
online_moderator 发表于 2015-11-1 11:02:47 | 显示全部楼层
只能说楼上的没什么见识 百度网盘等一系列产品不是duilib做的么 当然你要抱着什么东西别人都给你做好你就支拼装下的心态 那么你还适合做这个行业
87_avatar_middle
online_vip 发表于 2015-11-1 17:58:27 | 显示全部楼层
谢谢楼主分享哈 学习啦
84_avatar_middle
online_vip 发表于 2015-11-3 11:32:41 | 显示全部楼层
学VC++,必须要到VC驿站,我每天都在驿站学习,每天都在成长!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-5-21 13:42

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表