Duilib学习笔记(一)—— 环境搭建
Duilib简介
Duilib 是一款强大的界面开发工具,可以将用户界面和处理逻辑彻底分离,极大地提高用户界面的开发效率,遵循bsd协议。
源码编译
工具
操作系统:Windows 10
编译器:Visual Studio 2019
Github源码:https://github.com/duilib/duilib
步骤
1)解压Duilib源码,将解压出来的「duilib-master」文件夹重命名为「Duilib」
2)使用Visual Studio 2019打开「DuiLib.sln」
3)若打开「DuiLib.sln」的过程中提示重定向项目(如下图),点击确定即可。
4)检查「解决方案资源管理器中」是否有项目存在”Visual Studio 2013 - Windows XP“字样
5)修改步骤4图中标红的项目属性(右键-属性),将平台工具集修改为Visual Studio 2019(若没有该项请使用Visual Studio Installer安装相关SDK)
6)编译
7)Duilib提供了四种项目配置,第一次编译这四个项目配置时,都需要从步骤4开始。
- Debug:多字节字符集Debug版本
- Release:多字节字符集Release版本
- UnicodeDebug:Unicode字符集Debug版本
- UnicodeRelease:Unicode字符集Release版本
8)成功编译后,尝试运行示例程序。
9)步骤7图中的所有版本可以先都编译一份,在开发时,可以根据需求选择使用不同版本。
第一个Duilib项目
1)创建新项目-Windows桌面向导
2)配置新项目
3)将编译好的Duilib源码中的DuiLib文件夹拷贝至当前项目的源代码所在路径中
4)将编译好的Duilib源码中的lib文件夹拷贝至当前项目的DuiLib文件夹中
5)在当前项目源码路径中创建一个skin文件夹,在里面新建一个demo.xml文件,用于配置控件信息
6)编写代码
//stdafx.h
//stdafx.h
#pragma once
#define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的内容
// Windows 头文件
#include <windows.h>
// 包含库头文件
#include "DuiLib/UILib.h"
// 引入命名空间
using namespace DuiLib;
// 导入lib库
#ifndef UNICODE
#ifndef _DEBUG
// Release版本的库
#pragma comment(lib, "DuiLib\\lib\\Duilib.lib")
#else
// Debug版本的库
#pragma comment(lib, "DuiLib\\lib\\Duilib_d.lib")
#endif
#else
#ifndef _DEBUG
// Release版本的库
#pragma comment(lib, "DuiLib\\lib\\Duilib_u.lib")
#else
// Debug版本的库
#pragma comment(lib, "DuiLib\\lib\\Duilib_ud.lib")
#endif
#endif
//CMainWnd.h
#pragma once
#include "stdafx.h"
#include "DuiLib/Utils/WinImplBase.h"
#include "DuiLib/Core/UIDefine.h"
class CMainWnd :
public WindowImplBase
{
public:
CMainWnd(void);
virtual ~CMainWnd(void);
public:
virtual CDuiString GetSkinFolder();
virtual CDuiString GetSkinFile();
virtual LPCTSTR GetWindowClassName(void) const;
void Notify(TNotifyUI& msg);
};
//CMainWnd.cpp
#include "CMainWnd.h"
CMainWnd::CMainWnd(void)
{
}
CMainWnd::~CMainWnd(void)
{
}
CDuiString CMainWnd::GetSkinFolder()
{
return _T("");
}
CDuiString CMainWnd::GetSkinFile()
{
return _T("demo.xml");
}
LPCTSTR CMainWnd::GetWindowClassName(void) const
{
return _T("CMainWnd");
}
void CMainWnd::Notify(TNotifyUI& msg)
{
// 消息类型
if (msg.sType == _T("click")) {
// 控件名称
CDuiString sName = msg.pSender->GetName();
if (sName == _T("hello")) {
Close(IDOK);
// 如果不加这句,窗口关闭了,但程序不会退出
PostQuitMessage(0);
return;
}
}
WindowImplBase::Notify(msg);
}
//TestDuilib.cpp
#include "stdafx.h"
#include "CMainWnd.h"
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// 程序实例
CPaintManagerUI::SetInstance(hInstance);
// 配置资源路径
// 资源类型
//CPaintManagerUI::SetResourceType(UILIB_FILE);
// 资源路径:执行程序同目录的Skin文件夹下
// CPaintManagerUI::GetInstancePath() 执行程序目录
CDuiString sResourcePath;
sResourcePath.Format(_T("%s..\\TestDuilib\\skin"), CPaintManagerUI::GetInstancePath());
//MessageBox(NULL, sResourcePath, _T("test"), MB_OK);
CPaintManagerUI::SetResourcePath(sResourcePath);
//实例化窗口
CMainWnd* pMainWnd = new CMainWnd();
// 创建窗口
pMainWnd->Create(NULL, _T("TestDuilib"), WS_POPUP | WS_VISIBLE, 0);
// 窗口居中显示
pMainWnd->CenterWindow();
// 启动消息循环
CPaintManagerUI::MessageLoop();
return 0;
}
<?xml version="1.0" encoding="utf-8"?>
<!--前面创建的skin目录中的demo.xml代码-->
<Window size="800, 600" caption="0,0,0,30">
<VerticalLayout bkcolor="#ffffffff" childvalign="vcenter" childalign="center">
<HorizontalLayout />
<Button name="hello" bkcolor="#ffff0000" width="80" height="30" text="Hello World"/>
<HorizontalLayout />
</VerticalLayout>
</Window>
7)编译,检查是否编译成功
8)若编译成功,此时运行会提示找不到Duilib_ud.dll文件
9)将编译好的Duilib源码中的bin目录中的Duilib_ud.dll拷贝至当前项目的Debug文件夹,和exe文件放在一起
10)此时再运行,就能够成功运行了
点击中间红色按钮即可关闭程序。