Duilib 父窗口无效化和消息传递

news2024/11/22 17:11:58

文章目录

  • 1、父窗口无效化和消息传递
  • 2、EnableWindow()和SetFocus()的含义和用法

1、父窗口无效化和消息传递

当使用duillib界面库时,我们往往需要建立多个窗口,子窗口和父窗口之间有一定的逻辑需要,比如当子窗口弹出时,让父窗口无法处理父窗口内的控件的消息,即将父窗口无效化,直到子窗口关闭再恢复。

建立多个窗口,我们可以定义多个窗口类来一一对应。我建立窗口类的时候继承的是duilib库里面封装的窗口类WindowImpBase。重载父类里的消息处理函数,就可以实现对消息的过滤。

     virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);//消息处理函数

在建立子窗口的前面将父窗口无效化,然后在子窗口的WM_CLOSE消息处理中使父窗口还原,并获得焦点。代码如下:

void MainFrameWnd::Notify(TNotifyUI& msg){
	if (msg.sType == DUI_MSGTYPE_CLICK){
		if (msg.pSender == close_btn_){
			SendMessage(WM_SYSCOMMAND, SC_CLOSE, 0);
			return;
		}
		else if (msg.pSender == min_btn_){
			SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0);
			return;
		}
		else if (msg.pSender == max_btn_){
			SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, 0);
			return;
		}
		else if (msg.pSender == restore_btn_){
			SendMessage(WM_SYSCOMMAND, SC_RESTORE, 0);
			return;
		}
		else if (msg.pSender == mul_btn_){
			::EnableWindow(this->GetHWND(), false);    //父窗口无效化
			if (second_frame_wnd_ == nullptr){
				second_frame_wnd_ = new SecondFrameWnd();
				second_frame_wnd_->Create(this->GetHWND(), SecondFrameWnd::kClassName_, UI_WNDSTYLE_FRAME, 0);
			}
			second_frame_wnd_->CenterWindow();
			second_frame_wnd_->ShowWindow();
		}
	}
	__super::Notify(msg);
}

LRESULT MainFrameWnd::OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled){
	if (uMsg == WM_CLOSE){
		PostQuitMessage(0L);
	}
	return __super::OnClose(uMsg, wParam, lParam, bHandled);
}

LRESULT MainFrameWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam){
	//switch (uMsg)
	//{
	//case WM_CREATE:
	//	//其他初始化操作
	//	break;
	//case WM_KEYDOWN:{
	//	//处理键盘按下操作
	//	//VK_ESCAPE Esc键
	//	if (wParam == VK_ESCAPE){
	//		return 0;
	//	}
	//	break;
	//}
	//case WM_CLOSE:
	//	//处理窗口关闭事件
	//	break;
	//default:
	//	break;
	//}
	//return __super::HandleMessage(uMsg, wParam, lParam);                             //调用父类的消息处理函数

	if (uMsg == WM_CLOSE)
	{
		::EnableWindow(::GetParent(this->GetHWND()), TRUE);  // 父窗口还原 m_hwnd为子窗口句柄
		::SetFocus(::GetParent(this->GetHWND()));//设置焦点到父窗口
	}
	return __super::HandleMessage(uMsg, wParam, lParam);

}

这样就实现了父窗口的无效化,还可以给用户一点反馈。

这里我设计的是在父窗口的总布局内添加一个Control控件,让他覆盖整个父窗口,初始化为不可见,背景颜色设置为半透明的黑色。当父窗口无效化后,将Control控件设为可见,这样父窗口变灰,告诉用户父窗口不可用,还原后再设为不可见,这样就实现了一个父窗口无效化的反馈。这里就没写代码了,因为很简单就能实现。
在这里插入图片描述

2、EnableWindow()和SetFocus()的含义和用法

EnableWindow()函数用于启用或禁用窗口或控件。当传入参数为TRUE时,窗口或控件将启用,可以响应用户输入;当传入参数为FALSE时,窗口或控件将禁用,不再响应用户输入。

  • 该函数的调用格式为:EnableWindow(hWnd, bEnable),其中hWnd为窗口或控件的句柄,bEnable为一个BOOL值。
::EnableWindow(::GetParent(this->GetHWND()), TRUE);  // 父窗口还原 m_hwnd为子窗口句柄

SetFocus()函数用于设置焦点到指定的窗口或控件上。当调用该函数时,指定的窗口或控件将成为当前活动窗口,并接收用户输入。该函数的调用格式为:SetFocus(hWnd),其中hWnd为窗口或控件的句柄。

::SetFocus(::GetParent(this->GetHWND()));//设置焦点到父窗口

这些函数在DuiLib中也可以使用,通过获取控件的句柄(可以使用DuiLib提供的**FindControl()**等方法)来操作窗口或控件的启用状态和焦点。

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

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

相关文章

2022 Robocom CAIP 国赛 第二题

原题链接: PTA | 程序设计类实验辅助教学平台 题面: 副本是游戏里的一个特色玩法,主要为玩家带来装备、道具、游戏资源的产出,满足玩家的游戏进程。 在 MMORPG《最终幻想14》里,有一个攻略人数最大达到 48 人的副本“…

Office如何通过VSTO进行EXCEL插件开发?

文章目录 0.引言1.工具准备2.EXCEL外接程序创建和生成3.外接程序生成并使用 0.引言 VSTO(Visual Studio Tools for Office )是VBA的替代,是一套用于创建自定义Office应用程序的Visual Studio工具包。VSTO可以用Visual Basic 或者Visual C#扩展…

SPEC CPU 2006 在 CentOS 5.0 x86_64 古老系统测试【3】静态编译 invalid run

上篇 SPEC CPU 2006 在 CentOS 5.0 x86_64 古老系统测试【2】_hkNaruto的博客-CSDN博客 修改gcc41.cfg,全部添加上-static 测试指令 runspec -c gcc41.cfg -T all -n 3 -r 1 -I -i ref all 结果:正常运行并生成报告 invalid run Invalid SPEC CFP2006…

【算法基础】2.1栈和队列(单调栈和单调队列)

文章目录 例题3302. 表达式求值(栈的应用)😭😭😭😭😭830. 单调栈知识点解法 154. 滑动窗口 (单调队列)知识点解法 相关链接 & 相关题目 例题 3302. 表达式求值&…

在进行自动化测试,遇到验证码的问题,怎么办?

1.找开发去掉验证码或者使用万能验证码 2.使用OCR自动识别 使用OCR自动化识别,一般识别率不是太高,处理一般简单验证码还是没问题 这里使用的是Tesseract-OCR,下载地址:https://github.com/A9T9/Free-Ocr-Windows-Desktop/releases 怎么使…

linux centos7 静默安装 oracle 11g,【亲测有效】,包含远程连接、提供安装包

Centos7 安装oracle11g 环境准备 操作系统 centos7 oracle版本 oracle11g 终端软件 MobaXterm 192.168.46.61 oracleMaster 安装包 网盘地址 一、安装前准备 1、关闭selinux [rootoracleMaster ~]# vim /etc/selinux/config修改 SELINUX 为 disabled # This file controls …

网络安全(黑客技术)自学

引言 ✈️网络安全,顾名思义,无安全,不网络。现如今,安全行业飞速发展,我们呼吁专业化的 就职人员 与 大学生 ,而你,认为自己有资格当黑客吗? ✒️本文面向所有信息安全领域的初学者…

希尔排序

希尔排序 排序步骤 1、分组,以任意长度进行分组(这个长度我们称作增量gap);通常以总长度的一半这个数为依据进行分组,每间隔 gap 个数即为一组 2、组内排序;组内使用插入排序法进行排序 3、重新设置间隔…

Wi-Fi 相关概念

Wi-Fi 相关概念 802.11 Wi-Fi 标准及其含义频宽 和 带宽 的概念20MHz与40MHz的区别2.4G 频段2.4G的频道编号和中心频率 5G WiFi 频段中国开放的的5G WiFi频段:5G的频道编号和中心频率: 802.11历史进程一、802.11重要发展二、802.11协议族 参考 802.11 Wi…

阿里云 OSS 静态网站托管

本文节选自我的博客:阿里云 OSS 静态网站托管 💖 作者简介:大家好,我是MilesChen,偏前端的全栈开发者。📝 CSDN主页:爱吃糖的猫🔥📣 我的博客:爱吃糖的猫&…

云计算的学习(六)

六、云计算的发展趋势 1.云计算相关领域介绍 1.1物联网 物联网来源于互联网,是万物互联的结果,是人和物、物和物之间产生通信和交互。 物联网主要技术: RFID技术(射频识别技术)传感器技术嵌入式系统技术 1.2大数据…

SpringBoot+actuator和admin-UI实现监控中心

使用SpringBoot很久了&#xff0c;但是很少使用到SpringBoot的查看和监控&#xff0c;将来八成也不会用到&#xff0c;万一有机会用到呢&#xff1f;所以记录一下以前学习SpringBootactuator和adminUI实现监控中心的方式 Springboot的版本2.0.x <parent><groupId>…

在Linux下做性能分析2:ftrace

介绍 在我们进一步介绍更多模型分析技巧前&#xff0c;我们先要对基本工具有一些了解。这一篇先介绍ftrace的基本用法。 ftrace在内核的Documentation目录下已经有文档了&#xff0c;我这里不是要对那个文档进行翻译&#xff0c;而是要说明这个工具的设计理念和使用策略。细节…

H3C-Cloud Lab实验-链路聚合实验

实验拓扑图&#xff1a; 实验需求&#xff1a; 1、按照图示配置PC3和PC4的IP地址 2、在SW1和SW2的两条直连链路上配置链路聚合&#xff0c;实现链路冗余&#xff0c;并可以增加传输带宽 3、SW1和SW2之间的直连链路要配置为Trunk类型&#xff0c;允许所有vlan通过 4、中断SW…

基于JavaSwing+Mysql的仓库销售管理系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88049275 JDK1.8 MySQL5.7 功能&#xff1a;管理员与员工两个角色登录&#xff0c;基础数据查找&#xff0c;仓库查找&#xff0c;增删改查仓库信息、商品等 源码数据库文件配置文件课程设…

java单元测试(调试)

文章目录 测试分类JUnit单元测试介绍引入本地JUnit.jar编写和运行Test单元测试方法设置执行JUnit用例时支持控制台输入10.6.6 定义test测试方法模板 测试分类 **黑盒测试&#xff1a;**不需要写代码&#xff0c;给输入值&#xff0c;看程序是否能够输出期望的值。 **白盒测试…

LangChain + ChatGLM2-6B 搭建个人专属知识库

之前教过大家利用 langchain ChatGLM-6B 实现个人专属知识库&#xff0c;非常简单易上手。最近&#xff0c;智谱 AI 研发团队又推出了 ChatGLM 系列的新模型 ChatGLM2-6B&#xff0c;是开源中英双语对话模型 ChatGLM-6B 的第二代版本&#xff0c;性能更强悍。 树先生之所以现…

GitUI汉化

1.下载汉化文件 下载地址 备用下载地址 https://files.cnblogs.com/files/chenghu/git-gui-zh-master.zip https://files.cnblogs.com/files/chenghu/git-gui-zh-master.zip 2.找到git安装路径 C:\Program Files\Git\mingw64\share\git-gui\lib 3.解压出1下载的文件 复制粘…

配置无线网卡AP模式为wifi热点

1、判断网卡是否支持AP 不管是自带无线网卡、还是外接的usb无线网卡&#xff0c;要先配置为AP热点模式。需要看检查是否支持AP模式。 例如&#xff0c;这里插入 rtl8811c 的双频usb无线网卡&#xff0c;iwconfig查看网卡信息 nvidianvidia-desktop:~$ iwconfig wlan0 un…

数据结构——各种常见算法的实现方法和思路

文章目录 常见的排序算法类型复杂度和稳定性 1.冒泡排序2.直接插入排序3.希尔排序4.简单选择排序方法1&#xff1a;双向遍历选择排序方法2&#xff1a;单向遍历选择排序 5.归并排序方法1&#xff1a;递归方法2&#xff1a;非递归 6.快速排序方法1&#xff1a;随机取keyi方法2&a…