• 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>
     3usingnamespace 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#else11#   ifdef _UNICODE
    12 #       pragma comment(lib, "DuiLib_u.lib")
    13 #   else14 #       pragma comment(lib, "DuiLib.lib")
    15#   endif
    16#endif
    复制代码

    注意:如果将生成的程序拿到其他机器上运行,一定要复制DuiLib的相关Dll到应用程序的根目录。

    1. 创建对应的类

    创建一个C++类,让这个类继承Duilib的CWindowWnd和INotifyUI

    如下所示:

    在自己定义的类的头文件中加上

    复制代码
    1public:
    23 LPCTSTR GetWindowClassName() const;
    45void    Notify(TNotifyUI& msg);
    67 LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
    复制代码

    private:
    
        CPaintManagerUI m_pm;

    GetWindowClassName

    GetWindowClassName是设置类的类名称

    源文件可以如下定义:

    1 LPCTSTR CDuiLib_Dialog::GetWindowClassName() const2{
    3return (LPCTSTR)"CTestDlg"; /*自己可以随意取个名字*/4 }

    Notify

    Notify是Duilib中控件的响应函数,比如说某个控件按钮点击之后的处理。

    源文件可以如下定义:

    复制代码
     1void CDuiLib_Dialog::Notify(TNotifyUI& msg)
     2{
     3if( msg.sType == _T("click") )
     4    {
     5if( msg.pSender->GetName() == _T("closebtn") )
     6        {
     7            Close();
     8        }
     9    }
    10 }
    复制代码

    HandleMessage

    HandleMessage是Duilib中对消息循环的消息处理函数。

    可以在这个函数中对Duilib进行初始化

    源文件可以如下定义:

    复制代码
     1LRESULT CDuiLib_Dialog::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
     2{
     3if( 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);
    1415return0;
    16    }
    17elseif( uMsg == WM_DESTROY )
    18    {
    19         ::PostQuitMessage(0);
    20    }
    21     LRESULT lRes = 0;
    2223if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;
    2425return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
    26 }
    复制代码
    1. 创建窗体

    在主窗体中创建这个Duilib,

    在主窗体的这个类中加一个刚才增加的类对象 m_dlgDuilib(对象名随意)

    通过下面代码创建

    复制代码
    1if(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下载地址DuilibEmbedMFC.zip

  • 相关阅读:
    产品方法论
    elastic search语句
    计算机科学发展的动力
    理论计算机科学学习网站
    算法学习 howto
    人工智能和机器学习 AI&ML howto
    Deep Learning 和 Knowledge Graph howto
    LISP语言学习资源
    Turing Year 2012
    如何做好计算机科学研究
  • 原文地址:https://www.cnblogs.com/blogpro/p/11426967.html
Copyright © 2020-2023  润新知