duilib编写gui

2024/7/19 04:36:18

vcpkg install duilib下载库

vs中创建c++桌面程序,选择桌面程序,选择null项目

创建Main.cpp, 因为vcpkg配置的vs项目默认使用的是vcpkg\installed\x64-windows\include目录,所以#include "DuiLib/UIlib.h"

同时通过继承public WindowImplBase类创建界面,一个类对应一个xml。通过重写父类函数设置配置。

virtual LPCTSTR GetWindowClassName() const override { return _T("DUIMainFrame"); } //设置窗口类
virtual CDuiString GetSkinFile() override { return _T("MainWnd.xml"); }//设置关联的xml
virtual CDuiString GetSkinFolder() override { return _T("skin"); }//设置xml所在的文件夹

此外vs中配置项目:生成后事件命令行将目录下的xml文件复制到输出文件夹。或者配置xml文件属性复制到输出文件夹

if exist "$(OutDir)skin\" (
    rmdir /s /q "$(OutDir)skin"
)
xcopy /E /I /Y "$(ProjectDir)skin\*" "$(OutDir)skin\"

运行步骤:

  • 修改代码文件后,需要引入dll时,重新生成解决方案->运行本地调试器
  • 修改代码文件后,不需要引入dll时,->运行本地调试器
  • 修改xml后,重新生成解决方案->运行本地调试器。或者通过,添加外部工具,添加一个au3脚本,将xml复制到目标文件夹后,发送F5启动本地调试器还或者就是右键xml文件属性,选择复制文件,配置复制文件的位置。这样每创建一个文件都这样操作可能会麻烦一点。

close.png的路径相对与xml路径

<?xml version="1.0" encoding="utf-8"?>
<Window size="800,600" caption="true" resizable="true" maxbox="true" minbox="true">
		<VerticalLayout bkcolor="#FFFFFFFF">
			<Button name="btnClick" width="50" height="50" normalimage="file='close.png'" hotimage="file='close.png'" pushedimage="file='close.png'" />
		</VerticalLayout>
</Window>

教程:https://github.com/nmgwddj/duilib_tutorial

https://github.com/duilib/duilib/blob/master/doc

原理

CPaintManagerUI 是 Duilib 的核心管理类,负责管理窗口、控件的绘制和消息处理。它主要包含以下功能:

  • 资源管理:加载和管理 XML 界面文件、图像、5字体等资源。
  • 控件管理:管理所有 UI 控件,处理控件的创建、销毁和布局。
  • 消息分发:处理来自 Windows 系统的消息,并将消息分发给相应的控件。

CControlUI 是所有控件的基类,提供了基本的控件属性和方法。所有具体控件(如按钮、文本框、列表等)都从这个基类派生,并实现特定的功能。

使用 XML 文件来描述界面布局和控件属性。XML 文件定义了窗口的基本属性、布局方式和各个控件的具体属性。

采用事件驱动的方式处理用户交互。每个控件都可以响应用户的鼠标、键盘等事件。Notify函数中处理。

支持多种资源加载方式,包括从文件系统、资源文件(如 DLL、EXE)中加载图片、XML 布局文件等。通过 CPaintManagerUI::SetResourcePath 可以设置资源路径。

2024/8/2 16:39:54

xml中<HorizontalLayout bkcolor="#FFFFFFFF"/>这里的是八位十六进制,前两位表示 alpha(透明度)通道,00 表示完全透明,FF 表示完全不透明。后6位就是正常的rgb

2024/8/5 00:27:08

duilib中设置像素大小与实际符合的原因,系统dpi的问题。屏幕100%缩放对应的dpi为96.

计算公式为,当前dpi=96*屏幕缩放(如:125%,1.25)

实际像素大小=(当前dpi/96)*设置的像素大小

2024/8/5 17:02:08

获取dpi始终为96,但是系统确认是设置过屏幕缩放的,项目属性,清单工具,输入和输出,dpi识别功能,高dpi识别。设置后,xml中的像素大小与实际窗口的像素大小一致

  • 只修改xml,点击duilib调试,其他操作点击duilib重构
2024/8/6 10:31:48

Window标签至少有一个布局,不添加就按照位置属性(pos)定义位置

Control标签是一个基础控件,用于显示静态内容或图形元素。它是许多其他控件(如按钮、标签等)的基类

bordor:左、上、右、下