NIM_Duilib_Framework快速入门指南:构建你的第一个UI窗口

NIM_Duilib_Framework快速入门指南:构建你的第一个UI窗口

前言

NIM_Duilib_Framework是一个基于Duilib的Windows桌面应用UI开发框架,由网易云信团队维护。它提供了丰富的UI组件和便捷的开发接口,能够帮助开发者快速构建美观、高效的Windows桌面应用程序。本文将带你从零开始,使用NIM_Duilib_Framework创建一个基础的UI窗口。

环境准备

在开始之前,请确保你已经准备好以下开发环境:

  1. Visual Studio 2017或更高版本
  2. Windows SDK(建议使用最新版本)
  3. 获取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. 配置项目属性

按照以下步骤配置项目属性:

  1. 输出目录:设置为框架的bin目录
  2. 平台工具集:确保与Duilib编译使用的工具集一致
  3. 包含目录:添加tool_kits目录
  4. 运行库
    • Debug模式:/MTd
    • Release模式:/MT
  5. 项目引用:添加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();
}

运行效果

完成以上步骤后,编译并运行程序,你将看到一个具有以下特性的窗口:

  1. 800x600大小的窗口
  2. 带有标准窗口控制按钮(最小化、最大化/还原、关闭)
  3. 居中的文本标签
  4. 现代化的阴影效果
  5. 深色主题风格

进阶提示

  1. 自定义样式:通过修改XML文件可以轻松调整窗口样式和布局
  2. 事件处理:在窗口类中添加事件处理函数来响应按钮点击等用户操作
  3. 多窗口管理:可以创建多个窗口类来实现复杂的应用界面
  4. 国际化支持:框架支持多语言资源文件,便于实现国际化

通过本教程,你已经掌握了使用NIM_Duilib_Framework创建基础窗口的方法。这个框架的强大之处在于其灵活的XML界面描述和丰富的组件库,能够帮助你快速构建复杂的用户界面。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萧崧锟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值