duilib(及其增强版本duilib_ultimate)是一个在windows平台上用于c++桌面应用开发的轻量级ui库。它有其特定的优势和应用场景,但“好用”与否很大程度上取决于项目需求、开发者背景和个人体验。
下面我将从优缺点分析、难用原因以及基础使用方法几个方面为你详细介绍。
一、 duilib 的优势与劣势分析
“好用”是一个相对概念。为了客观评估,我们可以将其与其他主流ui框架(如qt、mfc)进行对比。
| 特性维度 | duilib / duilib_ultimate | qt | mfc |
|---|---|---|---|
| 平台支持 | 仅限 windows | 跨平台 (windows, linux, macos等) | 仅限 windows |
| 授权与开源 | 开源(如 duilib_ultimate) | 商业授权与开源lgpl双轨 | 微软官方,部分开源 |
| 界面绘制方式 | directui (自绘控件,无句柄) | 原生控件 + 自绘 | 基于窗口句柄的传统gdi |
| 界面设计 | xml描述 + 皮肤资源包 | qt designer (可视化,强大) | 资源编辑器 (rc文件) |
| 学习曲线 | 中等偏高 (需熟悉xml布局、消息映射) | 较平缓 (信号槽机制直观,文档丰富) | 陡峭 (基于文档/视图,历史包袱重) |
| 功能与生态 | 专注于windows ui,控件丰富但生态较小 | 功能大而全 (ui、网络、数据库等),生态强大 | 功能基础,偏底层,生态老旧 |
| 性能与体积 | 轻量级,性能较好,生成程序体积小 | 相对重量级,运行时库较大 | 较轻量,但现代特性支持不足 |
| 社区与资料 | 中文资料尚可(博客、教程),但官方文档和更新不及qt | 社区活跃,官方文档极其完善,书籍众多 | 资料老旧,新内容少 |
结论:
- duilib 好用在哪?
- 轻量高效:专为windows优化,无额外运行时依赖,软件启动快、体积小 。
- 界面灵活美观:基于directui和xml皮肤,可以实现非常炫酷、高度自定义的界面,不受系统主题限制 。
- 与mfc/win32结合容易:适合为已有mfc或win32项目换肤或增加现代化界面模块 。
- duilib 可能“难用”在哪?
- 平台锁定:仅限windows,跨平台项目无法使用 。
- 开发体验:需要手写或借助不完善的ui设计器编辑xml来布局,调试ui不如可视化设计直观 。
- 学习资料:虽然有不少中文教程(如仿迅雷播放器的系列文章 ),但缺乏体系化、官方的权威文档,遇到深度问题排查困难 。
- 稳定性与坑:早期版本某些控件(如richedit, combo)存在遗留问题,需要自己修复或寻找优化版(如duilib_ultimate)。
二、 duilib 基础使用流程简介
以下以 duilib_ultimate 为例,简要介绍如何开始一个项目 :
1. 环境准备与编译
// 1. 获取源码 // 使用git克隆项目(来源:duilib_ultimate项目地址) git clone https://gitcode.com/qdtroy/duilib_ultimate // 2. 使用visual studio (建议2015+) 打开解决方案文件 `duilib_ultimate.sln` // 3. 配置编译选项(如静态库/动态库、字符集) // 4. 生成解决方案。编译成功后,在`bin`目录下会有示例程序 。
2. 创建窗口与xml布局
duilib 应用的核心是 窗口类 和 xml皮肤文件。
c++ 窗口类:继承 windowimplbase,并重写相关虚函数。
// mywindow.h
#include "uilib.h"
using namespace duilib;
class cmywindow : public windowimplbase
{
public:
virtual cduistring getskinfolder() override { return _t("skin"); } // 皮肤文件夹
virtual cduistring getskinfile() override { return _t("my_window.xml"); } // 主皮肤xml文件
virtual lpctstr getwindowclassname(void) const override { return _t("mywindowclass"); }
// 响应按钮点击事件
void onclick(tnotifyui& msg) {
if (msg.psender->getname() == _t("btnclose")) {
close();
}
}
// 声明消息映射
dui_declare_message_map()
};
// mywindow.cpp
dui_begin_message_map(cmywindow, windowimplbase)
dui_on_click_event(_t("btnclose"), onclick) // 将名为"btnclose"的控件的点击事件映射到onclick函数
dui_end_message_map()xml 皮肤文件 (my_window.xml):在指定的皮肤文件夹(如skin)下创建,定义界面结构和样式。
<?xml version="1.0" encoding="utf-8"?>
<window size="400,300" caption="0,0,0,35">
<!-- 定义样式 -->
<default name="vbox" width="stretch" height="stretch" childrenvalign="top" />
<default name="button" width="80" height="28" normalimage="file='button_normal.png'" />
<!-- 界面布局 -->
<verticallayout name="vbox">
<horizontallayout height="35" bkcolor="#ffcccccc">
<label text="hello duilib" width="stretch" valign="center" align="center"/>
<button name="btnclose" text="关闭" float="true" pos="365,5,385,30"/>
</horizontallayout>
<container height="stretch">
<!-- 这里可以放置其他控件 -->
<label text="这是一个使用duilib创建的窗口。" align="center" valign="center"/>
</container>
</verticallayout>
</window>注释:xml中定义了窗口大小、一个标题栏(包含关闭按钮)和一个内容区域。bkcolor设置背景色,normalimage设置按钮图片 。
3. 程序入口点
#include "mywindow.h"
#include "uilib.h"
using namespace duilib;
int apientry winmain(hinstance hinstance, hinstance hprevinstance, lpstr lpcmdline, int ncmdshow)
{
cpaintmanagerui::setinstance(hinstance); // 设置实例句柄
cpaintmanagerui::setresourcepath(cpaintmanagerui::getinstancepath()); // 设置资源路径
cmywindow* pframe = new cmywindow();
if (pframe == null) return 0;
pframe->create(null, _t("my duilib app"), ui_wndstyle_frame, ws_ex_windowedge);
pframe->centerwindow();
pframe->showwindow(true);
cpaintmanagerui::messageloop(); // 进入消息循环
delete pframe;
return 0;
}三、 给觉得“难用”的开发者的建议
- 选择合适的版本:如果觉得原版duilib问题多,可以尝试 duilib_ultimate 等优化版本,它们修复了许多bug并增加了新特性 。
- 从示例入手:不要从零开始,先编译运行官方或社区的示例项目(如仿迅雷播放器 ),理解其代码结构和数据流。
- 善用xml:将界面布局和样式彻底交给xml,使c++代码更专注于业务逻辑。熟练掌握各种布局(
verticallayout,horizontallayout,tilelayout等)是关键 。 - 理解消息机制:duilib 使用一套类似mfc的消息映射宏(
dui_begin_message_map)来处理控件事件,这是连接界面与逻辑的桥梁 。 - 管理好资源:图片、xml等皮肤资源通常打包成zip文件。确保资源路径设置正确(
cpaintmanagerui::setresourcepath),这是界面显示不出来的常见原因 。
总结:duilib 在需要打造特色鲜明、性能要求高、且仅限于windows平台的桌面应用时,是一个“好用”的选择。它的“难用”主要来源于较陡的学习曲线、不够现代化的开发工具链以及相对分散的学习资源。如果你是一个c++开发者,项目恰好符合上述场景,并且愿意花时间克服初期的不适应,duilib 会是一个强大的工具。反之,如果你的项目需要考虑跨平台,或者追求更快速的开发迭代和更稳定的官方支持,那么 qt 无疑是更“好用”的选择 。
参考来源
- duilib_ultimate终极指南:从零开始掌握windows桌面ui开发
- 仿迅雷播放器教程 -- duilib界面(13)
- duilib进阶教程 -- 总结 (17)
- qt ui框架和duilib ui框架差别
- duilib进阶教程 -- 总结 (17)
- qt与duilib对比
到此这篇关于c++轻量级ui库duilib使用指南与优劣详解的文章就介绍到这了,更多相关c++ duilib使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论