如何新建一个duilib项目(手把手创建)

2023-11-01

如何新建一个duilib项目

duilib示例项目下载(0积分下载)

1.创建项目目录

​ 在桌面上新建一个文件夹 (MyDuilib),用来做我们项目的根目录。
在这里插入图片描述


2.创建一个Win32项目

1.打开VS2013,新建一个 Win32项目,项目目录选择上一步创建的文件夹 (MyDuilib) ,项目配置选择 Windows 应用程序,点击完成即可。

在这里插入图片描述

在这里插入图片描述

2.在解决方案管理器里找到我们刚才创建的DuilibDemo项目,打开DuilibDemo.cpp,保留_tWinMain函数,把其它代码删掉,删除完毕留下的代码如下(可直接复制)

在这里插入图片描述

#include "stdafx.h"
#include "DuilibDemo.h"

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

	return (int) 0;
}

此时编译运行会发现项目一闪而过


3.引入配置duilib库

1.将duilib库整个文件夹复制到项目同级目录下(即MyDuilib)

在这里插入图片描述

2.在项目同级目录下(MyDuilib)创建一个文件夹(Lib),将Duilib_d.expDuilib_d.lib复制到Lib

在这里插入图片描述

3.在解决方案管理器里打开StdAfx.h,包含duilib库头文件,引入命名空间,导入lib库

在这里插入图片描述
在这里插入图片描述

// 包含库头文件
#include "../../Duilib/UILib.h"
// 引入命名空间
using namespace DuiLib;
// 导入lib库
#ifndef _DEBUG
// Release版本的库
#pragma comment(lib, "..\\..\\Lib\\Duilib.lib")
#else
// Debug版本的库
#pragma comment(lib, "..\\..\\Lib\\Duilib_d.lib")
#endif

4.在解决方案管理器里打开DuilibDemo.cpp,初始化duilib库:配置duilib管理器,设置资源路径,启动duilib消息循环

在这里插入图片描述
在这里插入图片描述

同时在执行目录(DuilibDemo项目文件夹)下的Debug下新建一个Skin文件夹 (资源路径)

在这里插入图片描述

// 程序实例
	CPaintManagerUI::SetInstance(hInstance);
	// 配置资源路径
	// 资源类型
	CPaintManagerUI::SetResourceType(UILIB_FILE);
	// 资源路径:执行程序同目录的Skin文件夹下
	// CPaintManagerUI::GetInstancePath() 执行程序目录
	CDuiString sResourcePath;
	sResourcePath.Format(_T("%sSkin"), CPaintManagerUI::GetInstancePath());
	CPaintManagerUI::SetResourcePath(sResourcePath);

	// 启动消息循环
	CPaintManagerUI::MessageLoop();

此时初始化完成,尝试运行一下程序,会提示缺少Duilib_d.dll

5.把duilib库生产的Duilib_d.dll,复制到例子执行目录(DuilibDemo项目文件夹)下的Debug下。

在这里插入图片描述

此时再运行,程序正常运行,没有显示也没有退出,因为我们还没有创建窗口。

在这里插入图片描述


4.创建自己的duilib窗口类

1.在项目DuilibDemo上右击 -> 添加 -> 添加类MyMainWnd,这里的类需要继承基类WindowImplBase,并重写WindowImplBase中的三个函数:

GetSkinFile:返回窗口皮肤文件名称(导入xml页面)

GetWindowClassName:返回窗口类名

Notify:事件监听

在这里插入图片描述

在这里插入图片描述

打开MyMainWnd.h,写入以下代码

#pragma once
class MyMainWnd :public WindowImplBase, public CWebBrowserEventHandler
{
public:
	MyMainWnd();
	~MyMainWnd();

	virtual CDuiString GetSkinFile();
	virtual LPCTSTR GetWindowClassName(void) const;
	virtual void Notify(TNotifyUI& msg);
};


打开MyMainWnd.cpp,写入以下代码

#include "StdAfx.h"
#include "MyMainWnd.h"

MyMainWnd::MyMainWnd(void)
{
}

MyMainWnd::~MyMainWnd(void)
{
}

CDuiString MyMainWnd::GetSkinFile()
{
	return _T("main.xml");// 名字可以按照窗口类名字取
}

LPCTSTR MyMainWnd::GetWindowClassName(void) const
{
	return _T("MyMainWnd"); // 名字可以按照窗口类名字取
}

void MyMainWnd::Notify(TNotifyUI& msg)
{
	WindowImplBase::Notify(msg);
}

5.从主函数入口打开窗口

解决方案管理器里打开DuilibDemo.cpp,写入以下代码并添加头文件

	MyMainWnd* pMainWnd = new MyMainWnd();
	// 创建窗口
	pMainWnd->Create(NULL, _T("LoveDuilib"), WS_POPUP | WS_VISIBLE, 0);
	// 窗口居中显示
	pMainWnd->CenterWindow();

在这里插入图片描述

此时运行运行程序会提示缺少xml文件
在这里插入图片描述


6.创建xml文件

项目右键 -> 添加 -> 添加新项main.xml记得放在Skin文件夹中

在这里插入图片描述

复制一份简单的xml代码到新建的main.xml

<?xml version="1.0" encoding="utf-8"?>
<Window size="800, 600" caption="0,0,0,30">
  <VerticalLayout bkcolor="#ffffeeee" childvalign="vcenter" childalign="center">
    <Button name="closebtn" bkcolor="#ffff0000" width="200" height="80" text="关闭窗口"/>
  </VerticalLayout>
</Window>

运行程序
在这里插入图片描述

点击关闭窗口后窗口关闭了,但程序还在运行,需要添加监听事件来终止程序。
在这里插入图片描述


7.添加监听事件,关闭窗口

MyMainWnd.cpp中的Notify函数里写入以下代码。

// 消息类型
	if (msg.sType == _T("click")) {
		// 控件名称
		CDuiString sName = msg.pSender->GetName();
		if (sName == _T("closebtn")) {
			Close(IDOK);
			// 如果不加这句,窗口关闭了,但程序不会退出
			PostQuitMessage(0);
			return;
		}
	}
	WindowImplBase::Notify(msg);

在这里插入图片描述

此时运行程序可以正常启动,点击按钮也可以正常关闭。

本文章改自《duilib入门到精通》- 如何新建一个duilib项目

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何新建一个duilib项目(手把手创建) 的相关文章

  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri

随机推荐

  • 音视频 SDL简介

    一 SDL简介 SDL Simple DirectMedia Layer 是一套开放源代码的跨平台多媒体开发库 使用C语言写成 SDL提供了数种控制图像 声音 输出入的函数 让开发者只要用相同或是相似的代码就可以开发出跨多个平台 Linux
  • 911接线员(C++制作)

    哈喽 鸽了许久的酱某终于回来啦 又来整新活了 在中国 紧急拨号一般分成 110 120 119 但在美国 他们的救援电话是一体的 那就是 911 一款名叫 911接线员 的游戏便应运而生了 但这并不是酱某我的游戏 今天我们就要复刻一下这款策
  • 字符串模式匹配

    字符串模式匹配 1 BF算法 初始时让目标T的第 0 位与模式P的第 0 位对齐 顺序比对目标T与模式P中的对应字符 若 P 与 T 比对发现对应位不匹配 则本趟失配 将 P 右移一位与 T 对齐 进行下一趟比对 若 P 与 T 对应位都相
  • STM8硬件IIC从机

    一 平台 芯片 STM8S103F3P6 环境 IAR STVP 系统 WIN7 二 目的 STM8S103F3P6 使用STM8标准库开发 角色 从机 方式 硬件IIC STM32H7 角色 主机 方式 IO口模拟IIC主机 主机发送命令
  • spark安装部署

    spark安装部署 需要指导私信 所有节点安装scala 安装scala需要安装openjdk 8 jre 当前用户如果没有sudo权限可将其加入sudo组里 以ubuntu2204 LTS为例 sudo apt update sudo a
  • 2023护网日记,护网工作内容、护网事件、告警流量分析

    2023护网日记 一 监控设备 二 工作内容 三 安全事件 1 失陷主机排查 2 后门网站修复 四 告警流量分析 1 信息泄露 2 SQL注入 3 文件上传 4 XSS 跨站脚本 5 代码执行 今年 HW 行动正式开启人员招募 总的来说 人
  • JMETER接口测试,参数关联,断言,定时器,前置处理器,后置处理器,cookie

    jmeter如何测试接口 jmeter可以做性能测试 当然同样可以用来做接口的自动测试 打开jmeter图形界面 右键添加一个线程组 取名 API接口测试 添加一个事务控制器 可以简单的先理解为一个接口组 例如 文件接口 用户接口 登录接口
  • LED+串口通信小试牛刀

    目录 一 搭建STM32的开发环境 1 安装STM32CubeMX 2 安装MDK5 二 闪烁原理 三 STM32CUBEMX生成代码 四 keil仿真调试并生成hex文件 五 运行结果 六 STM32通过串口通信 汇编 1 USART介绍
  • C#关于 SQL Server 数据库的操作

    C 创建SQL Server数据库 设置SQL Server数据库为只读状态 修改和压缩SQL Server数据库 新建 删除和修改 数据表 修改 新增和删除 数据列 代码 using System using System Collect
  • Leetcode——比较版本号

    1 比较版本号 1 字符串模拟 对字符串进行分割 诸位比较 修订号 大小即可 对于缺省的修订号位置 使用 00 进行代指 时间复杂度 令 v1 长度为 n v2 长度为 m 整体复杂度为O max n m 空间复杂度 O n m O n m
  • 敏捷测试

    目录 一 敏捷软件研发思想及在企业中的做法 1 什么是敏捷开发 如何理解 2 敏捷测试常用术语 3 主要角色及职责 4 敏捷开发每日站会 5 Scrum详细解释 6 敏捷软件开发宣言 http agilemanifesto org 7 敏捷
  • 基于PyTorch的深度学习--创建卷积神经网络-面向对象的神经网络

    本篇文章是翻译 https deeplizard com网站中的关于Pytorch学习的文章 供学习使用 原文地址为 https deeplizard com learn video k4jY9L8H89U 使用PyTorch创建神经网络
  • macOS免费串口工具coolTerm/Minicom/Comtool/Volt+(伏特加)/友善串口调试助手/screen/picocom

    macOS下免费的串口调试工具不多 图形化的工具有coolTerm comtool Volt 友善串口调试助手 命令行的工具有minicom screen和picocom 1 coolTerm coolTerm 点击下载mac版 是一个图形
  • win7下面怎么安装Active Directory

    可以先安裝下面補丁 網上可下載 可區分簡體 繁體版 Windows6 1 KB958830 x64 RefreshPkg msu Windows6 1 KB958830 x86 RefreshPkg msu 下面提供方法 1 根據環境選擇所
  • 深度优先遍历(Depth-First Search, DFS)和广度优先遍历(Breadth-First Search, BFS)

    深度优先遍历 DFS 问题1 什么是深度优先遍历 DFS 答案 深度优先遍历是一种用于遍历树或图的算法 它从根节点 或其他起始节点 开始 首先探索尽可能深的分支 然后回溯并继续探索其他分支 它通常使用递归或栈来实现 问题2 如何实现深度优先
  • C++ vector容器-45-vector互换和节省空间和预留空间

    这篇来学习vector一个互换操作 也就是有两个vector对象 可以通过一个api 把两个对象互换过来 实际上 就是在内存中交换了对象的指针 原来的指针指向新的vector对象 这种交换有时候是很有必要 特别是匿名vector对象进行交换
  • UE4蓝图系统详细讲解

    关于UE4蓝图系统原理可以参考 UE4编辑器进阶 里面清楚的讲解了关于编辑器开发所涉及到的知识点 比如蓝图开发 虚拟机开发 蓝图编译 反射数据 序列化字节码等
  • 解决Mac安装Homebrew失败

    首先使用Homebrew官网的安装shell命令安装 bin bash c curl fsSL https raw githubusercontent com Homebrew install HEAD install sh 会出现如下错误
  • JSON.stringify()和JSON.parse()应用场景

    前言 JSON stringify 将对象 数组转换成字符串 JSON parse 将字符串转成json对象 应用场景 1 a 浏览器创建 获取 sessionStorage localStorage 数组内容 b 路由 浏览器地址 传参
  • 如何新建一个duilib项目(手把手创建)

    如何新建一个duilib项目 duilib示例项目下载 0积分下载 1 创建项目目录 在桌面上新建一个文件夹 MyDuilib 用来做我们项目的根目录 2 创建一个Win32项目 1 打开VS2013 新建一个 Win32项目 项目目录选择