69人参与 • 2026-05-14 • C/C++
duilib(及其增强版本duilib_ultimate)是一个在windows平台上用于c++桌面应用开发的轻量级ui库。它有其特定的优势和应用场景,但“好用”与否很大程度上取决于项目需求、开发者背景和个人体验。
下面我将从优缺点分析、难用原因以及基础使用方法几个方面为你详细介绍。
“好用”是一个相对概念。为了客观评估,我们可以将其与其他主流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_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;
}verticallayout, horizontallayout, tilelayout等)是关键 。dui_begin_message_map)来处理控件事件,这是连接界面与逻辑的桥梁 。cpaintmanagerui::setresourcepath),这是界面显示不出来的常见原因 。总结:duilib 在需要打造特色鲜明、性能要求高、且仅限于windows平台的桌面应用时,是一个“好用”的选择。它的“难用”主要来源于较陡的学习曲线、不够现代化的开发工具链以及相对分散的学习资源。如果你是一个c++开发者,项目恰好符合上述场景,并且愿意花时间克服初期的不适应,duilib 会是一个强大的工具。反之,如果你的项目需要考虑跨平台,或者追求更快速的开发迭代和更稳定的官方支持,那么 qt 无疑是更“好用”的选择 。
到此这篇关于c++轻量级ui库duilib使用指南与优劣详解的文章就介绍到这了,更多相关c++ duilib使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论