当前位置: 首页 > news >正文

使用DuiLib进行UI开发的虚函数解析及控件绑定、响应与消息处理

DuiLib是一个开源的基于DirectUI思想的Windows界面库,提供了灵活且易用的UI界面开发能力。在使用DuiLib进行开发时,我们常常会遇到一些虚函数,它们在不同的阶段被调用,以完成各种初始化和消息处理工作。本文将详细介绍DuiLib中的一些关键虚函数的作用,并讲解如何通过XML定义控件、进行控件绑定和响应,以及处理消息。

一、DuiLib中的关键虚函数
  1. GetSkinFile

    • 作用:返回应用程序的皮肤文件名,用于界面布局和外观。
    • 示例:
      CDuiString GetSkinFile() override
      {return _T("your_skin_file.xml");
      }
      

2. GetWindowClassName

  • 作用:返回窗口的类名,这是一个唯一标识符,用于注册窗口类。
  • 示例:
    LPCTSTR GetWindowClassName() const override
    {return _T("YourWindowClass");
    }
    

3.InitWindow

  • 作用:初始化窗口,调用基类的初始化方法和自定义的Init()方法来准备窗口的UI组件。
  • 示例:
    void InitWindow() override
    {WindowImplBase::InitWindow();Init();
    }
    

    4.Notify

  • 作用:处理窗口中的用户交互通知,如按钮点击等。
  • 示例:
    void Notify(TNotifyUI& msg) override
    {if (msg.sType == _T("click")){if (msg.pSender->GetName() == _T("btnOK")){// Handle OK button click}}
    }
    

    5.

    OnFinalMessage

  • 作用:在窗口关闭时被调用,用于进行清理工作,如发送退出消息和删除窗口对象。
  • 示例:
    void OnFinalMessage(HWND hWnd) override
    {WindowImplBase::OnFinalMessage(hWnd);PostQuitMessage(0);delete this;
    }
    

    6.HandleCustomMessage

  • 作用:处理自定义的消息,如计时器消息和DPI改变消息。
  • 示例:
    LRESULT HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) override
    {if (uMsg == WM_TIMER){// Handle timer message}return 0;
    }
    

二、通过XML定义控件并进行绑定

在DuiLib中,界面的布局和控件通常通过XML文件来定义。以下是一个简单的XML文件示例,该文件定义了一个带有按钮和标签的布局:

 

<?xml version="1.0" encoding="utf-8"?>
<Window size="400,300" caption="Demo" mininfo="400,300" maxinfo="400,300"><VerticalLayout><Button name="btnOK" text="确定" /><Label name="lblStatus" text="状态" /></VerticalLayout>
</Window>

1.定义控件变量

在类定义中添加相应的控件变量:

class CMainWnd : public WindowImplBase
{
public:CButtonUI* m_pBtnOK;CLabelUI* m_pLblStatus;// 其他函数和成员变量
};

2.在Init函数中绑定控件

在Init函数中通过FindControl方法将XML中的控件绑定到变量:

void CMainWnd::Init()
{m_pBtnOK = static_cast<CButtonUI*>(m_pm.FindControl(_T("btnOK")));m_pLblStatus = static_cast<CLabelUI*>(m_pm.FindControl(_T("lblStatus")));
}
三、处理控件响应与消息

在DuiLib中,通过重载Notify函数来处理控件的响应。例如,当按钮被点击时,我们可以在Notify函数中进行处理:

void CMainWnd::Notify(TNotifyUI& msg)
{if (msg.sType == _T("click")){if (msg.pSender == m_pBtnOK){m_pLblStatus->SetText(_T("按钮被点击"));}}
}
四、处理自定义消息

有时我们需要处理一些自定义的消息,例如计时器消息或DPI改变消息。可以通过重载HandleCustomMessage函数来处理这些消息:

LRESULT CMainWnd::HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{if (uMsg == WM_TIMER){// 处理计时器消息}else if (uMsg == WM_DPICHANGED){// 处理DPI改变消息}return 0;
}

通过重载DuiLib中的一些关键虚函数,我们可以方便地进行窗口初始化、控件绑定、响应处理和自定义消息处理。在开发过程中,通过合理使用这些虚函数和XML布局文件,可以大大提高UI开发的效率和可维护性。希望本文能够帮助你更好地理解和使用DuiLib进行Windows界面开发。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • selenium----CSS表达式选择元素
  • PDF解锁网站
  • 数据库DDL | 增 删 改 操作 | 对数据库数据表
  • 【Java基础语法】字符修改,以及equals的用法
  • JS逆向高级爬虫
  • 【BUG】已解决:ERROR: Failed building wheel for jupyter-nbextensions-configurator
  • 【Linux】文件系统|CHS寻址|LBA逻辑块|文件索引|inode|Date block|inodeBitmap|blockBitmap
  • Python3网络爬虫开发实战(4)数据的存储
  • [Vulnhub] Raven2 PHPMailer-RCE+MSQP:Mysql权限提升
  • 【MQTT(4)】开发一个客户端,QT-Android安卓手机版本,Mosquitto替换成libhv库
  • PHP Switch 语句
  • 跨越平台的智能:Mojo模型的自定义与动态部署
  • Vue.js 2 项目实战(五):水果购物车
  • 德国云手机:企业移动办公解决方案
  • transformers进行学习率调整lr_scheduler(warmup)
  • @angular/forms 源码解析之双向绑定
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • java2019面试题北京
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • tab.js分享及浏览器兼容性问题汇总
  • v-if和v-for连用出现的问题
  • Yeoman_Bower_Grunt
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 问题之ssh中Host key verification failed的解决
  • 项目管理碎碎念系列之一:干系人管理
  • 带你开发类似Pokemon Go的AR游戏
  • ​iOS安全加固方法及实现
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (1) caustics\
  • (1)Nginx简介和安装教程
  • (16)Reactor的测试——响应式Spring的道法术器
  • (2)STM32单片机上位机
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (第30天)二叉树阶段总结
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (简单) HDU 2612 Find a way,BFS。
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (十三)Maven插件解析运行机制
  • (算法)前K大的和
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .Net core 6.0 升8.0
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET技术成长路线架构图
  • .NET中使用Protobuffer 实现序列化和反序列化
  • @antv/g6 业务场景:流程图
  • @selector(..)警告提示
  • []sim300 GPRS数据收发程序
  • [8] CUDA之向量点乘和矩阵乘法
  • [BUAA软工]第一次博客作业---阅读《构建之法》
  • [C#学习笔记]LINQ
  • [Codeforces] number theory (R1600) Part.11
  • [FFmpeg] windows下安装带gpu加速的ffmpeg