NIM_Duilib_Framework快速入门指南:构建你的第一个UI窗口
前言
NIM_Duilib_Framework是一个基于Duilib的Windows桌面应用UI开发框架,由网易云信团队维护。它提供了丰富的UI组件和便捷的开发接口,能够帮助开发者快速构建美观、高效的Windows桌面应用程序。本文将带你从零开始,使用NIM_Duilib_Framework创建一个基础的UI窗口。
环境准备
在开始之前,请确保你已经准备好以下开发环境:
- Visual Studio 2017或更高版本
- Windows SDK(建议使用最新版本)
- 获取NIM_Duilib_Framework项目代码
项目配置
1. 创建基础工程
首先创建一个新的Windows桌面应用程序项目,清理自动生成的代码,只保留wWinMain函数框架:
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
return 0;
}
2. 添加必要项目引用
将框架中的核心项目添加到你的解决方案中:
- base:基础库,提供线程管理等基础功能
- shared:共享库,包含公共工具和定义
- duilib:UI核心库,包含所有UI组件和功能
3. 配置项目属性
按照以下步骤配置项目属性:
- 输出目录:设置为框架的bin目录
- 平台工具集:确保与Duilib编译使用的工具集一致
- 包含目录:添加tool_kits目录
- 运行库:
- Debug模式:/MTd
- Release模式:/MT
- 项目引用:添加base、shared和duilib作为引用项目
核心代码实现
1. 引入必要头文件
在stdafx.h中添加以下头文件:
// 基础库
#include "base/base.h"
// 共享库
#include "shared/shared.h"
// Duilib核心
#include "duilib/UIlib.h"
2. 实现主线程类
创建一个继承自nbase::FrameworkThread的主线程类,负责UI初始化和清理:
class MainThread : public nbase::FrameworkThread {
public:
MainThread() : nbase::FrameworkThread("MainThread") {}
virtual ~MainThread() {}
private:
virtual void Init() override;
virtual void Cleanup() override;
};
实现主线程方法:
void MainThread::Init() {
nbase::ThreadManager::RegisterThread(kThreadUI);
// 初始化UI全局管理器
std::wstring theme_dir = QPath::GetAppPath();
ui::GlobalManager::Startup(theme_dir + L"resources\\",
ui::CreateControlCallback(),
false);
}
void MainThread::Cleanup() {
ui::GlobalManager::Shutdown();
SetThreadWasQuitProperly(true);
nbase::ThreadManager::UnregisterThread();
}
3. 修改wWinMain函数
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow) {
MainThread thread;
thread.RunOnCurrentThreadWithLoop(nbase::MessageLoop::kUIMessageLoop);
return 0;
}
创建第一个窗口
1. 定义窗口类
创建一个继承自ui::WindowImplBase的窗口类:
class BasicForm : public ui::WindowImplBase {
public:
BasicForm();
~BasicForm();
// 必须重写的三个方法
virtual std::wstring GetSkinFolder() override;
virtual std::wstring GetSkinFile() override;
virtual std::wstring GetWindowClassName() const override;
// 可选重写方法
virtual void InitWindow() override;
virtual LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
static const std::wstring kClassName;
};
2. 实现窗口类
const std::wstring BasicForm::kClassName = L"Basic";
std::wstring BasicForm::GetSkinFolder() {
return L"basic";
}
std::wstring BasicForm::GetSkinFile() {
return L"basic.xml";
}
std::wstring BasicForm::GetWindowClassName() const {
return kClassName;
}
void BasicForm::InitWindow() {
// 在这里初始化窗口控件
}
LRESULT BasicForm::OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
PostQuitMessage(0L);
return __super::OnClose(uMsg, wParam, lParam, bHandled);
}
3. 创建XML界面描述
在resources\themes\default目录下创建basic文件夹,并添加basic.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<Window size="800,600" caption="0,0,0,35">
<VBox bkcolor="bk_wnd_darkcolor">
<HBox width="stretch" height="35" bkcolor="bk_wnd_lightcolor">
<Control />
<Button class="btn_wnd_min" name="minbtn" margin="4,6,0,0"/>
<Box width="21" margin="4,6,0,0">
<Button class="btn_wnd_max" name="maxbtn"/>
<Button class="btn_wnd_restore" name="restorebtn" visible="false"/>
</Box>
<Button class="btn_wnd_close" name="closebtn" margin="4,6,8,0"/>
</HBox>
<Box>
<VBox margin="0,0,0,0" valign="center" halign="center" width="auto" height="auto">
<Label name="tooltip" text="This is a baisc window form created by nim duilib."/>
</VBox>
</Box>
</VBox>
</Window>
4. 显示窗口
在主线程的Init方法中创建并显示窗口:
void MainThread::Init() {
// ...之前的初始化代码...
BasicForm* window = new BasicForm();
window->Create(NULL, BasicForm::kClassName.c_str(),
WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX, 0);
window->CenterWindow();
window->ShowWindow();
}
运行效果
完成以上步骤后,编译并运行程序,你将看到一个具有以下特性的窗口:
- 800x600大小的窗口
- 带有标准窗口控制按钮(最小化、最大化/还原、关闭)
- 居中的文本标签
- 现代化的阴影效果
- 深色主题风格
进阶提示
- 自定义样式:通过修改XML文件可以轻松调整窗口样式和布局
- 事件处理:在窗口类中添加事件处理函数来响应按钮点击等用户操作
- 多窗口管理:可以创建多个窗口类来实现复杂的应用界面
- 国际化支持:框架支持多语言资源文件,便于实现国际化
通过本教程,你已经掌握了使用NIM_Duilib_Framework创建基础窗口的方法。这个框架的强大之处在于其灵活的XML界面描述和丰富的组件库,能够帮助你快速构建复杂的用户界面。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考