最近使用Duilib做了一个简单的桌面应用,在此做一个简单的总结,一是为了记录自己的学习过程,二是对Duilib的使用做一个简单的总结以便后期使用时查阅。
专注于为中小企业提供成都网站设计、成都网站制作服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业祁门免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了1000多家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。直接上网站:https://github.com/qdtroy/DuiLib_Ultimate
Github连接
个人理解:
Duilib是Windows系统下基于C++语言的一套开源的桌面应用的UI库。
从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的使用有两种方式,一种是DLL方式,一种是静态Lib方式
1.使用DLL的方式时,DLL需要和应用程序一起发布,同时放在应用程序的目录下。如果做成安装包时,需要把DLL也一起安装了,同时DLL需要注册。优点在于:应用程序比较小。
2.使用静态Lib时,不需要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
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
#include
#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
不同的名称可以在编译源码时进行修改和设置,如下图:
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。