Windows 小记 18 —— 子窗口继承父窗口的样式

子窗口会继承父窗口或者所有者窗口的一些样式。

当我们使用 CreateWindowExW 创建窗口后,指定其 HwndParent 参数时,或者通过 SetWindowLongPtr(vd->Hwnd, GWLP_HWNDPARENT, (LONG_PTR)vd->HwndParent); 指定所有者窗口时,子窗口将从父窗口/所有者窗口拷贝部分样式和扩展样式。

例如,当所有者窗口具有 WS_EX_TOPMOST 样式时候,其创建的子窗口将具有 WS_EX_TOPMOST 样式。

所以,当你发现你的 WS_POPUP 样式的窗口默认具有 WS_EX_TOPMOST 时候,不要觉得奇怪。可能是你设置了所有者窗口。

此问题发生在 ImGui 的 win32 后端逻辑中,作者错误地设置所有者窗口,导致当 win32 平台窗口设置 WS_EX_TOPMOST 样式时,无法控制在多视口中的新窗口的样式。

修复方法,在 SetWindowPos 中加入一个控制开关 ConfigViewportsNoTopmost:

static void ImGui_ImplWin32_SetWindowPos(ImGuiViewport* viewport, ImVec2 pos)
{ImGui_ImplWin32_ViewportData* vd = (ImGui_ImplWin32_ViewportData*)viewport->PlatformUserData;IM_ASSERT(vd->Hwnd != 0);RECT rect = { (LONG)pos.x, (LONG)pos.y, (LONG)pos.x, (LONG)pos.y };if (viewport->Flags & ImGuiViewportFlags_OwnedByApp)ImGui_ImplWin32_UpdateWin32StyleFromWindow(viewport); // Not our window, poll style before usingImGuiIO gIO = ImGui::GetIO();if (gIO.ConfigViewportsNoTopmost)vd->DwExStyle &= ~WS_EX_TOPMOST;::AdjustWindowRectEx(&rect, vd->DwStyle, FALSE, vd->DwExStyle);if(gIO.ConfigViewportsNoTopmost)::SetWindowPos(vd->Hwnd, HWND_NOTOPMOST, rect.left, rect.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);else::SetWindowPos(vd->Hwnd, nullptr, rect.left, rect.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
}

ConfigViewportsNoTopmost 添加到 ImGuiIO 结构中即可,这样就可以在代码中设置了:

// Setup Dear ImGui context
// 设置 ImGui 的上下文
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;     // Enable Keyboard Controls   启用键盘控制
io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;      // Enable Gamepad Controls    启用手柄控制
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;         // Enable Docking             启用 docking 停靠模式
io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;       // Enable Multi-Viewport / Platform Windows   启用多视口平台窗口
io.ConfigFlags |= ImGuiConfigFlags_TransparentBackbuffers;  // Enable transparent backbuffer support
io.ConfigViewportsNoAutoMerge = true;.....io.ConfigViewportsNoTopmost = true;  // 这是新增的控制多视口窗口不置顶

好了,分享就到这里结束了。

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

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

相关文章

19、《Springboot+MongoDB整合:玩转文档型数据库》

SpringbootMongoDB整合:玩转文档型数据库 摘要:本文全面讲解Spring Boot与MongoDB的整合实践,涵盖环境搭建、CRUD操作、聚合查询、事务管理、性能优化等核心内容。通过15个典型代码示例,演示如何高效操作文档数据库,深…

跳跃游戏II(力扣45)

这道题在跳跃游戏(力扣55)-CSDN博客 的基础上需要找到最小的跳跃次数。那么我们需要用一个变量来统计跳跃次数,而难点就在于何时让该变量的值增加。这一点我写在注释中,大家结合我的代码会更好理解。其他部分跟跳跃游戏(力扣55)-CSDN博客 几乎相同&#…

Linux基础开发工具的使用(apt、vim、gcc、g++、gdb、make、makefile)

Linux软件包管理器–apt Linux安装软件的方式 在Linux下安装软件的方法有以下三种: 下载到程序的源代码,自己编译出可执行程序获取deb安装包、然后使用dpkg命令安装。(不解决依赖关系)通过apt进行安装软件。 小知识点&#xf…

C/C++ | 每日一练 (2)

💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 C/C | 每日一练 (2)题目参考答案封装继承多态虚函数底…

【前端框架】vue2和vue3的区别详细介绍

Vue 3 作为 Vue 2 的迭代版本,在性能、语法、架构设计等多个维度均有显著的变革与优化。以下详细剖析二者的区别: 响应式系统 Vue 2 实现原理:基于 Object.defineProperty() 方法实现响应式。当一个 Vue 实例创建时,Vue 会遍历…

基于Spring Boot的农事管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

【RISCV 常见汇编指令学习 1.2 -- CSRW | CSRR | XORI | ANDI | DRET | J | JR】

文章目录 Overview1. CSRW 与 CSRR2. SW 与 lw3. XORI 与 ANDI4. J 与 JR5. ret 与 dret6. 总结🌐 Sources Overview 在 RISCV 汇编中,不同类型的指令用于完成控制寄存器操作、内存存取、位操作、跳转以及返回等功能。下面将逐对详细介绍这些指令&#…

MySQL六大日志的功能介绍。

前言 首先,MySQL的日志应该包括二进制日志(Binary Log)、错误日志(Error Log)、查询日志(General Query Log)、慢查询日志(Slow Query Log)、重做日志(Redo …

【AI】GitHub Copilot

GitHub Copilot 是一款由 GitHub 和 OpenAI 合作开发的 AI 编程助手,它可以在多种开发工具中使用。以下是 GitHub Copilot 支持的主要开发工具和平台: 1. Visual Studio Code (VS Code) 官方支持:GitHub Copilot 在 VS Code 中拥有最完整的集…

拆解微软CEO纳德拉战略蓝图:AI、量子计算、游戏革命如何改写未来规则!

2025年2月19日 知名博主Dwarkesh Patel对话微软CEO萨蒂亚纳德拉 在最新访谈释放重磅信号:AI将掀起工业革命级增长,量子计算突破引爆材料科学革命,游戏引擎进化为世界模拟器。 整个视频梳理出几大核心观点,揭示科技巨头的未来十年…

4.2 学习UVM中的“connect_phase“,将其应用到具体案例分为几步?

文章目录 前言1. connect_phase 的作用与执行顺序2. TLM 连接的类型与示例2.1 生产者-消费者模型2.2 分析端口广播模型 3. 层次化连接示例4. 动态连接与条件化配置5. 关键注意事项6. 完整示例:SoC 验证环境连接6.1 Monitor 广播数据6.2 Scoreboard 和 Coverage6.3 E…

HBase Shell

目录 1. HBase常用命令1.1 create命令1.2 list命令1.3 describe命令1.4 put命令1.5 get命令1.6 scan命令1.7 count命令1.8 exists命令1.9 修改表结构1.10 delete命令1.11 deleteall命令1.12 truncate命令1.13 disable、drop命令1.14 status命令1.15 version命令 2. HBase Shell…

MATLAB基础学习相关知识

MATLAB安装参考:抖音-记录美好生活 MATLAB基础知识学习参考:【1小时Matlab速成教程-哔哩哔哩】 https://b23.tv/CnvHtO3 第1部分:变量定义和基本运算 生成矩阵: % 生成矩阵% 直接法% ,表示行 ;表示列 a [1,2,3;4,5,6;7,8,9];%…

用自定义注解实现Excel数据导入中的枚举值校验

使用自定义注解实现Excel数据导入中的枚举值校验 在实际开发中,我们经常需要从Excel文件中导入数据,并且这些数据需要符合一定的规则,比如某些字段的值必须是预定义的枚举值。本文将介绍如何使用自定义注解来实现这一功能,以提高…

基于ffmpeg+openGL ES实现的视频编辑工具-opengl相关逻辑(五)

在我们的项目中,OpenGL ES 扮演着至关重要的角色,其主要功能是获取图像数据,经过一系列修饰后将处理结果展示到屏幕上,以此实现各种丰富多样的视觉效果。为了让大家更好地理解后续知识,本文将详细介绍 OpenGL 相关代码。需要注意的是,当前方案将对 OpenGL 的所有操作都集…

dify安装

官网教程 https://github.com/langgenius/dify/blob/main/README_CN.md 1、下载源码 git clone https://github.com/langgenius/dify.git 2、进入docker目录 cd dify cd docker cp .env.example .env修改nginx对外端口配置 修改为9000 最后执行:docker compo…

前端导出word文件,并包含导出Echarts图表等

基础导出模板 const html <html><head><style>body {font-family: Times New Roman;}h1 {text-align: center;}table {border-collapse: collapse;width: 100%;color: #1118FF;font-weight: 600;}th,td {border: 1px solid black;padding: 8px;text-align: …

【ETL】从理论到Python实践的数据处理

引言 ETL&#xff08;Extract, Transform, Load&#xff09;是一种数据处理过程&#xff0c;用于将数据从一个或多个源提取出来&#xff0c;进行清洗、转换和整合&#xff0c;然后加载到目标数据仓库或数据库中。ETL 是数据仓库和数据分析领域中不可或缺的一部分&#xff0c;广…

若依Flowable工作流版本监听器使用方法

1.前言 本文详细介绍如何在若依Flowable工作流版本&#xff08;RuoYi-Vue-Flowable&#xff09;中配置执行监听器和任务监听器。是以我二次开发的代码为基础&#xff0c;介绍如何配置监听器&#xff0c;已解决源码在新增或删除监听器出现的问题&#xff0c;如果需要二次开发的…