使用Duilib做桌面应用总结

最近使用Duilib做了一个简单的桌面应用,在此做一个简单的总结,一是为了记录自己的学习过程,二是对Duilib的使用做一个简单的总结以便后期使用时查阅。

Duilib介绍

直接上网站:https://github.com/qdtroy/DuiLib_Ultimate
Github连接

个人理解:

是一个UI库基于C++语言开发开源Windows系统,桌面应用

Duilib是Windows系统下基于C++语言的一套开源的桌面应用的UI库。

源码编译及Demo运行

从github上直接把×××下来或者拉下来

解压源码,源码结构说明如下:

3.使用VS打开项目,如果提示有升级就确认即可

4.第一次打开解决方案会比较慢,只能耐心等待。打开成功以后即可看到项目结构如下图:

5.查看项目属性,下载下来的代码默认使用Unicode字符集,dll方式使用duilib

6.选中duilib项目,右键打开菜单,选择“生成”选项开始生成项目。生成成功以后,会在bin木下生成dll文件。

dll文件的名称和项目属性的配置有关,默认生成的dll名称为:DuiLib_d.dll,同时位于DuiLib_Ultimate\bin目录下

7.duilib库编译生成完成以后,就可以生成demo了。打开demo项目,选中任一项目,并选择设置为启动项目,然后选择生成选项。

8.生成完成以后,启动运行项目即可看到结果。

特别注意

生成的时候可以选择批生成,批生成就是所有项目全部生成。批生成比较慢,请耐心等待此处之所以选择设置为启动项目,目的是为了好调试。选择批生成以后,所有项目都会生成到bin目录下。

生成完成以后,即可在bin目录下查看生成的项目。

Duilib使用介绍

  
Duilib的使用有两种方式,一种是DLL方式,一种是静态Lib方式
  

1.使用DLL的方式时,DLL需要和应用程序一起发布,同时放在应用程序的目录下。如果做成安装包时,需要把DLL也一起安装了,同时DLL需要注册。优点在于:应用程序比较小。
 
2.使用静态Lib时,不需要DLL,但是应用程序比较大。
  

两种方式均可以使用,至于使用哪种方式还需要结合具体实现的功能讨论

 

DLL方式使用介绍

 
从github上下载的代码默认使用的就是dll的方式,详细的使用过程可参考源码
 

1.编译出DLL以便使用。在文章的【源码编译及Demo运行】已进行详细介绍。

 

2.使用VS创建一个新的解决方案.创建一个新的解决方案的原因是为了从头开始搭建一个开发的环境,因此没有在源码的基础上添加工程。

1.文件->新建->项目 【创建一个Win32项目】,使用默认选项创建。


Win32Project1项目即是我们的主项目,我们自己的代码或者功能就是在此项目内实现的

3.拷贝源码目录到我们的项目目录下

先把DuiLib整个目录拷贝到新建的解决方案目录下:

DuiLib_Ultimate\DuiLib ----->Win32Project1

4.删除VS默认生成的所有代码。如果报错的话,删除不存在的头文件。保留如下两项。

 

5.添加一个类:CDuiFrameWnd,如果生成cpp文件可删除。代码如下
 

#pragma once
#include <UIlib.h>
using namespace DuiLib;

class CDuiFrameWnd : public CWindowWnd, public INotifyUI
{
public:
virtual LPCTSTR GetWindowClassName() const { return _T("DUIMainFrame"); }
virtual void Notify(TNotifyUI& msg) {}

virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam){ LRESULT lRes = 0; if (uMsg == WM_CREATE) { CControlUI *pWnd = new CButtonUI; pWnd->SetText(_T("Hello World")); // 设置文字 pWnd->SetBkColor(0xFF00FF00); // 设置背景色 m_PaintManager.Init(m_hWnd); m_PaintManager.AttachDialog(pWnd); return lRes; } if (m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes)) { return lRes; } return __super::HandleMessage(uMsg, wParam, lParam);}

protected:
CPaintManagerUI m_PaintManager;
};

  **现在要解决报错的问题,原因是找不到头文件,因此我们要设置头文件所在路径**  **1.打开项目属性选项->VC++选项->配置include目录和库目录**  ![](https://s1.51cto.com/images/blog/201803/24/b7fcee772f8ad720d4159a5d650731c5.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) **2.首先设置include目录,include目录为duilib的根目录,推荐使用相对路径配置,此处为:../DuiLib 添加以后已经不报错了**  ![](https://s1.51cto.com/images/blog/201803/24/cdc5b6300b141493e3df047e2fbcbcfe.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) **3.修改入口文件也就main函数所在文件,此示例中为:Win32Project1.cpp**  ```c++#include "stdafx.h"#include <windows.h>#include <tchar.h>#include "DuiFrameWnd.h" //本次添加int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){ // 一下内容为本次修改 CPaintManagerUI::SetInstance(hInstance); CDuiFrameWnd duiFrame; duiFrame.Create(NULL, _T("DUIWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE); duiFrame.ShowModal(); return 0;}

我们在工程目录下新建一个目录为lib。从源码编译的目录里面拷贝文件到lib目录下,如果嫌麻烦可以全部一起拷贝。
 
使用dll方式时,dll和应用程序要放在同一个目录下,因此我们把源码编译后bin目录下的:DuiLib****.dll的文件全部也拷贝到lib目录下,以便使用。
 
拷贝完成后的lib目录如下:
  

 

设置工程的lib目录和lib名称
 

如果找不到lib时编译报错信息如下
 
 

原因是找不到lib文件。
到源码工程里面找到lib目录,将里面的文件按照配置复制到我们自己的目录下。

运行项目,报错如下:
 

 

把dll文件复制到debug目录下即可。如果是Release版本的话,则在Release目录下。此处选择复制的dll为DuiLib_d.dll。


  

另外,也可以在代码中设置使用lib

在DuiFrameWnd.h文件中添加如下宏定义,那么会根据不同的配置使用不同lib,同样的也需要拷贝对应的dll文件。

#ifdef _DEBUG# ifdef _UNICODE# pragma comment(lib, "DuiLib_ud.lib")# else# pragma comment(lib, "DuiLib_d.lib")# endif#else# ifdef _UNICODE# pragma comment(lib, "DuiLib_u.lib")# else# pragma comment(lib, "DuiLib.lib")# endif#endif

不同的名称可以在编译源码时进行修改和设置,如下图:

 

静态Lib方式使用介绍使用总结