8、DuiLib创建子窗口

news2025/7/19 8:58:54

文章目录

  • 1、创建子窗口
  • 2、创建子窗口 XML 配置文件

1、创建子窗口

一个大规模的应用不可能只有一个窗口,之前我们的案例都是在一个窗口实现的,接下来我们实现一个关于窗口,来介绍如何通过 DuiLib 实现子窗口管理。

2、创建子窗口 XML 配置文件

前面我们已经做了很多 XML 的案例了,所以这里就不多说了,直接将写好的 XML 贴上来给大家做一下简单分析,然后直接使用。

<?xml version="1.0" encoding="utf-8"?>
<Window size="480,360" caption="0,0,0,35">
  <Default name="Button" value="bordersize=&quot;3&quot; bordercolor=&quot;#FF222222&quot;" />
  <Font shared="true" id="1" name="微软雅黑" size="14" />
  <VerticalLayout>
    <!-- 标题栏 -->
    <HorizontalLayout height="35" bkcolor="#FFD6DBE9" inset="8,8,8,0">
      <HorizontalLayout width="185">
        <Control bkimage="logo.png" height="18" width="18" />
        <Label text="关于" height="18" padding="8" font="1"/>
      </HorizontalLayout>
      <Control />
      <HorizontalLayout width="32">
        <Button name="closebtn" height="32" width="32" normalimage="btn_close_normal.png" hotimage="btn_close_hovered.png" pushedimage="btn_close_pushed.png" />
      </HorizontalLayout>
    </HorizontalLayout>
    <HorizontalLayout bkcolor="#FFFFFFFF">
      <Label align="center" text="duilib tutorial, created by jiajia_deng" />
    </HorizontalLayout>
  </VerticalLayout>
</Window>

窗口还是保留标题栏,但只有一个关闭按钮了,并且关闭按钮的名字我修改成了btn_close ,目的就是不想让窗口走默认的关闭流程。窗口中只有一个 Label 显示了一串文字(毕竟这不是重点)。然后我们需要新建一个类,与 MainWndFrame 窗口一样,WindowImplBase 继承 实现各个虚函数。如下所示:
second_window.h:

#pragma once

class MulWndFrame :public WindowImplBase{
protected:
	virtual CDuiString GetSkinFolder()   override;                          //获取皮肤文件的目录,如果有多层目录这里可以设置,例如xml皮肤

	virtual CDuiString GetSkinFile()     override;                          //设置皮肤的名字     就是xml文件名字

	virtual LPCTSTR    GetWindowClassName(void) const override;             //设置当前窗口的名字  class name

	virtual DuiLib::UILIB_RESOURCETYPE GetResourceType() const override;    //返回资源类型

	virtual LPCTSTR    GetResourceID()   const override;                    //如果是ZIP资源,返回资源ID

	virtual void       InitWindow()      override;                          //窗口初始化函数

	virtual void       Notify(TNotifyUI& msg) override;                     //通知事件处理函数

public:
	static const LPCTSTR	kClassName;
	static const LPCTSTR	kMulWndFrame;

private:
	CButtonUI*				close_btn_ = nullptr;
};

second_window.cpp:

#include"stdafx.h"
#include"resource.h"
#include"second_window.h"

const LPCTSTR MulWndFrame::kClassName = _T("second_wnd_frame");
const LPCTSTR MulWndFrame::kMulWndFrame = _T("second_wnd_frame.xml");

CDuiString MulWndFrame::GetSkinFolder(){
#if _DEBUG
	return _T("theme");
#else
	return m_PaintManager.GetInstancePath();
#endif
}

CDuiString MulWndFrame::GetSkinFile(){
	return kMulWndFrame;
}

LPCTSTR MulWndFrame::GetWindowClassName(void) const {
	return kClassName;
}

DuiLib::UILIB_RESOURCETYPE MulWndFrame::GetResourceType() const {
#if _DEBUG
	return UILIB_FILE;
#else
	return UILIB_ZIPRESOURCE;
#endif
}

LPCTSTR MulWndFrame::GetResourceID() const{
	//return MAKEINTRESOURCE(IDR_ZIPRES1);
	return nullptr;
}

void MulWndFrame::InitWindow(){
	close_btn_ = dynamic_cast<CButtonUI*>(m_PaintManager.FindControl(_T("closebtn")));
}

//创建新窗口
void MulWndFrame::Notify(TNotifyUI& msg){
#if 0
	if (msg.sType == DUI_MSGTYPE_CLICK)
	{
		CDuiString strName = msg.pSender->GetName();
		if (strName == _T("btn_wnd_min"))
		{
			SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0);
		}
	}
#endif
	if (msg.sType == DUI_MSGTYPE_CLICK){
		CDuiString str_name = msg.pSender->GetName();
		if (str_name == "closebtn"){
			HWND hWndParent = GetWindowOwner(m_hWnd);
			if (hWndParent)
			{
				::EnableWindow(hWndParent, TRUE);
				::SetFocus(hWndParent);
			}
			ShowWindow(false);
		}
	}
	//__super::Notify(msg);
}

随后在 main_wnd_frame.xml 中,增加一个多窗口按钮最小化按钮左边

<Button name="mulbtn" height="32" width="32" normalimage="btn_mul_wnd.png"  hotimage="btn_mul_wnd_hover.png" pushedimage="btn_mul_wnd_hover.png" />

此时主窗口就会显示一个关于按钮了,注意我们也修改了父容器的宽度,因为比之前多了一个按钮,我们要算上按钮宽度和间距增大父容器的宽度。
在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<Window size="640,480" mininfo="640,480" caption="0,0,0,35" sizebox="4,4,4,4">
  <Default name="Button" value="bordersize=&quot;5&quot; bordercolor=&quot;#FF222222&quot;" />
  <Font shared="true" id="0" name="幼圆" size="12" default="true" />
  <Font shared="true" id="1" name="微软雅黑" size="18" underline="true" bold="true"/>
  <VerticalLayout>

    <!--标题栏-->
    <HorizontalLayout height="50" bkcolor="#FFD6DBE9" inset="4,4,8,6" >
      <HorizontalLayout width="185">
        <Control bkimage="logo.png" height="32" width="32"   />
        <Label text="duilib tutorial" height="32"   padding="8,-2,4,0" font="1" />
      </HorizontalLayout>
      <Control />
      <HorizontalLayout childpadding="3" width="250">
        <Button name="btnHideLoginDialog" text="隐藏登录框" tooltip="隐藏登录框"  width="100" height="100" textcolor="#00ffda8a"  normalimage="btn_min_hovered.png" hotimage="btn_min_hovered.png" />
        <Button name="mulbtn" height="32" width="32" normalimage="btn_mul_wnd.png"  hotimage="btn_mul_wnd_hover.png" pushedimage="btn_mul_wnd_hover.png" />
        <Button name="minbtn" height="32" width="32" normalimage="btn_min_normal.png" hotimage="btn_min_hovered.png" pushedimage="btn_min_pushed.png" />
        <Button name="maxbtn" height="32" width="32" normalimage="btn_max_normal.png" hotimage="btn_max_hovered.png" pushedimage="btn_max_pushed.png" />
        <Button name="restorebtn" visible="false" height="32" width="32" normalimage="btn_reset_normal.png" hotimage="btn_reset_hovered.png" pushedimage="btn_reset_pushed.png" />
        <Button name="closebtn" height="32" width="32" normalimage="btn_close_normal.png" hotimage="btn_close_hovered.png" pushedimage="btn_close_pushed.png" />
      </HorizontalLayout>
    </HorizontalLayout>

    <!--窗口内容区域-->
    <HorizontalLayout bkcolor="#FF4D6082">
      <List name="main_wnd_list" header="hidden" padding="10,10,10,10" />
    </HorizontalLayout>
  </VerticalLayout>
</Window>

接下来做关于按钮的响应,首先添加一个按钮的成员变量来接收关于按钮,然后再 inlucde 关于窗口的头文件 second_window.h,并添加一个窗口的成员变量 MulWndFrame。重载 OnClick 方法判断当前点击的是否是关于按钮,如果是那么就显示关于窗口。代码如下:

void MainFrameWnd::OnClick(TNotifyUI& msg){
	CDuiString str_name = msg.pSender->GetName();
	if (str_name == _T("minbtn")){
		SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0);
		return;
	}
	else if (str_name == _T("maxbtn")){
		SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, 0);
		return;
	}
	else if (str_name == _T("restorebtn")){
		SendMessage(WM_SYSCOMMAND, SC_RESTORE, 0);
		return;
	}
	else if (str_name == _T("closebtn")){
		Close();
		return;
	}
	else if (str_name == _T("mulbtn")){
		if (mul_wnd_frame_ == nullptr){
			mul_wnd_frame_ = new MulWndFrame;
			mul_wnd_frame_->Create(this->GetHWND(), MulWndFrame::kClassName, UI_WNDSTYLE_FRAME, 0);
		}
		mul_wnd_frame_->CenterWindow(); 
		mul_wnd_frame_->ShowWindow();
	}
	__super::OnClick(msg);
	return;
}

这里有个小技巧就是判断窗口是不是 nullptr,如果是 nullptr 就全新 new 一个 MulWndFrame,如果是有效的指针则直接显示窗口。在 MulWndFrame中在关闭窗口时,只需要激活父窗口然后把自己隐藏掉就可以了。如下所示:

//创建新窗口
void MulWndFrame::Notify(TNotifyUI& msg){
#if 0
	if (msg.sType == DUI_MSGTYPE_CLICK)
	{
		CDuiString strName = msg.pSender->GetName();
		if (strName == _T("btn_wnd_min"))
		{
			SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0);
		}
	}
#endif
	if (msg.sType == DUI_MSGTYPE_CLICK){
		CDuiString str_name = msg.pSender->GetName();
		if (str_name == "closebtn"){
			HWND hWndParent = GetWindowOwner(m_hWnd);
			if (hWndParent)
			{
				::EnableWindow(hWndParent, TRUE);
				::SetFocus(hWndParent);
			}
			ShowWindow(false);
		}
	}
	//__super::Notify(msg);
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/666835.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小红书种草软文怎么写?教你几招

小红书种草软文写得好&#xff0c;能打消用户的疑虑&#xff0c;吸引更多的用户关注和购买你的产品&#xff0c;从而获得源源不断的流量和口碑&#xff0c;小红书种草软文怎么写&#xff1f;接下来伯乐网络传媒就来给大家讲解一下&#xff0c;教你几招超实用的方法&#xff01;…

MMSegmentation V0.27.0官方问题(包含多尺度设置)(四)

1、在单个 GPU 上再现性能 #179&#xff08;添加链接描述&#xff09; 2、如何使用 PyTorch 的 WeightedRandomSampler 或编写自定义采样器添加链接描述 4、使用独立的分段器 #2931添加链接描述 5、How to change the training policy from Iter to Epoch based on the existin…

【产品运营】如何通过数据分析掌握用户行为?

对于运营来说&#xff0c;需要掌握用户行为来制定不同的运营策略。而用户行为是通过数据分析得出的&#xff0c;那么&#xff0c;具体的数据分析是哪些数据&#xff0c;不同的数据又有什么区别&#xff1f; 通过本文能够学到什么&#xff1f; 快速了解一款APP。行业趋势&#…

完美解决 ---latex运行正常,但是公式显示有问题,latex公式不显示等号 = 和加号 +

文章目录 一、问题展示二、分析原因三、 我的解决办法四、 \usepackage{txfonts}宏包是什么&#xff1f;五、\usepackage{amsmath}宏包是什么&#xff1f;总结 一、问题展示 latex运行正常&#xff0c;但是公式显示有问题&#xff0c;latex公式不显示等号 和加号 二、分析原…

C++基础(9)——文件操作

前言 本文主要介绍了C中文件操作基本知识 5.1&#xff1a;C语言使用标准C库函数读写文件复习 fgets、fputs&#xff08;读写文本文件&#xff09; int main(int argc, char *argv[]) {FILE *file;file fopen("a.txt", "a");if (file NULL){perror(&q…

flutter项目启动安卓模拟器不好使的问题

这里写自定义目录标题 一. 新建的flutter项目安卓模拟器不能使用二当上面操作完成以后,新建的flutter项目可以使用安卓模拟器,但是老项目不好使的解决方法 在flutter项目中,ios模拟器好使,安卓模拟器不好使. 分为2种情况: 一. 新建的flutter项目安卓模拟器不能使用 但是在and…

专业的性能测试工具都具备哪些特点?

在软件开发和系统运行过程中&#xff0c;性能是一个关键的指标&#xff0c;直接影响到用户体验和系统的可靠性。为了确保软件和系统的性能达到预期水平&#xff0c;专业的性能测试工具成为必不可少的一环。那专业的性能测试工具都具备哪些特点&#xff1f;探讨其在软件开发和系…

分享几个免费设计生成及参考工具(第三期)

今天来给大家分享几个国外免费的设计生成工具 Uxcrush https://www.uxcrush.com/ 一个收集优秀 Figma 资源的网站&#xff0c;包括网站模板、移动模板、UI套件、图标、设备模型、插画等等。希望为 Figma 用户提供一个方便找到最适合他们设计项目或学习目标的资源站。 unpromp…

用Python写了一个下载网站所有内容的软件,可见即可下

目录标题 前言效果展示环境介绍:代码实战获取数据获取视频采集弹幕采集评论 GUI部分尾语 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 今天我们分享一个用Python写下载视频弹幕评论的代码。 顺便把这些写成GUI&#xff0c;把这些功能放到一起让朋友用起来更方便~ 效果…

FAQ页面在SaaS产品中的应用

随着云计算和软件即服务&#xff08;SaaS&#xff09;的快速发展&#xff0c;越来越多的企业选择将业务迁移到云端&#xff0c;以更好地管理和运营他们的业务。在这种背景下&#xff0c;SaaS产品的出现成为了企业管理和运营的新趋势。SaaS产品通过云端的方式&#xff0c;为企业…

【linux】不小心对整个/usr/目录执行了chmod 777命令,如何恢复故障的权限设定

一、问题背景 在安装ansys的时候&#xff0c;脑子抽风&#xff0c;以为/usr/目录是共享目录&#xff0c;直接把所有文件或目录的权限完全设置为全用户自由读写和执行即可。 但是没想到执行了命令sudo chmod -R 777 /usr/命令之后&#xff0c;出现了一大堆sudo权限错误。 较为…

基于AT89S52单片机的多功能电子万年历

1、 项目介绍&#xff08;设计内容&#xff09; 基于AT89S52单片机的多功能电子万年历的硬件结构和软硬件设计方法。本设计由数据显示模块、温度采集模块、时间处理模块和调整设置模块四个模块组成。系统以AT89S52单片机为控制器&#xff0c;以串行时钟日历芯片DS1302记录日历…

小程序中各类二维码、小程序码,在各种场景下,长按识别支持情况验证结果

近期由于业务涉及到小程序长按识别加群、关注公众号等业务&#xff0c;各类场景下的支持情况&#xff0c;官方文档也没有特别具体的说明&#xff0c;所以整体做了一些测试。测试结果如下&#xff0c;如果有一些不准确或者未验证的情况&#xff0c;欢迎大家指正、补充哈~ 小程序…

Unity核心8——模型导入

一、模型导入概述 ​ Unity 支持很多模型格式。比如 .fbx /.dae /.3ds /.dxf /.obj 等等。 ​ 99%的模型都不是在 Unity 中制作的&#xff0c;都是美术人员在建模软件中制作&#xff0c;如 3DMax、Maya 等等。 ​ 当他们制作完模型后&#xff0c;虽然 Unity 支持很多模型格式…

公司内部资料!游戏上线前部署准备,就这新手都行

前言 游戏做的差不多了&#xff0c;是时候准备上线测试部署了&#xff0c;选一个靠谱的云服务器厂商还是很重要&#xff0c;这次准备尝试用下华为云的服务&#xff0c;为了在上线前做足准备&#xff0c;先做一次预演&#xff0c;省得到时候手忙脚乱。也给其他的同事做一个文档…

PRL:中国科大观测到单体量子系统中最强的量子互文性

近期&#xff0c;中国科学技术大学郭光灿院士团队在量子物理基本问题研究中取得重要进展。 ——该团队李传锋、许金时等与南开大学陈景灵教授、西班牙塞维利亚大学Adn Cabello教授等合作&#xff0c;实验研究了单体高维量子系统中对应于多体非定域性的量子关联&#xff0c;从而…

数据库管理-第八十三期 炒点冷饭(20230620)

数据库管理 2023-06-20 第八十三期 抄点冷饭1 ORA-040312 Shared Pool3 Library Cache4 Doc ID 2590172.15 Bug 34832725总结 第八十三期 抄点冷饭 上周&#xff0c;借着剩余的两天年假&#xff0c;又从300多个小时中拿了3天出来&#xff0c;加上前后两个周末&#xff0c;去泰…

结合符号性记忆,清华等提出ChatDB,提升大模型的复杂推理能力

结合符号性记忆&#xff0c;清华等提出ChatDB&#xff0c;提升大模型的复杂推理能力 随着大语言模型&#xff08;Large Language Models&#xff09;的爆火&#xff0c;例如 ChatGPT&#xff0c;GPT-4&#xff0c;PaLM&#xff0c;LLaMA 等&#xff0c;如何让大语言模型更好的…

自动化测试如何区分用例集合?你一定要知道

目录 前言 业务量和复杂度增长现状是什么&#xff1f; 如何区分自动化测试的用例集合&#xff1f; 区分用例集合的过程要注意什么&#xff1f; 总结&#xff1a; 前言 有同学在后台问到&#xff1a;业务比较复杂&#xff0c;有很多串行并行甚至组合的业务场景&#xff0c;执…

NeurIPS 2022|DeepMind最新研究:大模型背后的ICL可能与数据分布密切相关

NeurIPS 2022&#xff5c;DeepMind最新研究&#xff1a;大模型背后的ICL可能与数据分布密切相关 大模型自然语言处理机器学习 传统的文本语言模型倾向于两阶段的训练模式&#xff0c;即首先在大规模语料库上进行预训练&#xff0c;然后在目标下游任务上进行微调&#xff0c;这…