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.pswp.cn/diannao/70490.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70490.shtml
英文地址,請注明出處:http://en.pswp.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;如果需要二次開發的…