Window 窗口属性及嵌入窗口到D3D渲染窗口顶层

2023-11-02

Window窗口有很多属性,可以通过设定window的style和ex style中知道。


这些属性有时候在实现某些效果的时候,是非常非常重要(以前都没有怎么详细了解,只是在用到对应的API时看一下,根本没有详细深入)。


这里想记录一下最近工作上遇到的问题,是关于窗口的层次关系或者可以说是彼此之间的包含关系,和窗口控制的经验


首先,需要知道parent和owner之间的区别:

1、如果一个窗口有WS_CHILD属性,那么它一定有一个父窗口,即GetParent()返回的一定是其父窗口;

2、如果一个窗口有WS_CHILD属性,那么它一定不能够是popup/overlap(这两个属性在CreateWindow里面出入,或者使用GetWindowLong/SetWindowlong,GWL_STYLE进行设定)窗口;

3、top-level窗口是指,在桌面下一层的窗口,它只能是popup/overlap窗口;

4、popup/overlap窗口,是top-level窗口,通常popup窗口是我们看到的普通的dialog窗口,而overlap窗口是我们用MFC直接创建的那些single document的窗口;

5、owner窗口只能是top-level窗口,owned窗口也是top-level窗口;

6、GetParent()函数返回的是对应窗口的parent,或者是owner窗口

7、GetWindow(hWnd, GW_OWNER)返回的只能够是owner窗口,否则就是NULL;

8、要获取真正的parent窗口,逻辑应该这样:UINT style = GetWindowLong(hWnd, GWL_STYLE);  return style & WS_CHILD ? GetParent(hWnd) : GetWindow(hWnd, GW_OWNER);


由于以下这篇文章写得实在太好了,我是参考下面得出上面的结论的:


http://www.laho.gov.cn/cjs_new/print.jsp?oldID=34


这个blog也有对窗口属性的详细讲解,我也参考了一些呢:

http://www.cppblog.com/Clouderman/default.html?page=2


然后就是MSDN上的东西也是需要看的:


http://msdn.microsoft.com/en-us/library/ms632599%28v=VS.85%29.aspx


msdn貌似才是最权威的,但上面的那个文章中提及的东西和其中的实验,非常值得一看,看完上面,再看下面,会比较实际,呵呵


如何将一个窗口挂在一个D3D渲染的窗口前面,目前有三种选择:

1、创建owner/owned窗口

由于owned窗口一定在owned窗口前面,所以这个方法是行得通的。window的机制,能够确保:

1) owner窗口渲染完之后,再渲染owned窗口;

2) owner窗口最小化时,owned窗口也一起最小化;

3) owner窗口恢复的时候,owned窗口也一起恢复;

如果你在spy++中查看owner和owned窗口的层次,你会发现他们是在同一层的,owner/owned窗口关系没有parent/child窗口关系强!(详细的看上面的链接,里面有更清楚的描述)。

我这里想说的是,owner/owned窗口,有一个限制条件,就是owner/owned窗口都必须是top-level窗口。这就出问题了:如果我的D3D窗口是某个窗口的子窗口,怎么办呢?那么这时候,就会很容易出现问题了,由于渲染的D3D窗口本身是一个child窗口,十分容易收到父窗口的影响,而你创建的这个owned窗口,是受渲染窗口的父窗口控制的,由于你通常都是拥有渲染窗口的HANDLE,有时候owner窗口做出的操作并不是你想要的!这时候就麻烦了,需要通过检测各种各样的消息避免一些你不想出现的情况。

PS:创建owner/owned窗口的SDK方法是:CreateWindow("mywinclass", "title", WS_POPUP, x, y, w, h, hOwnerWnd, NULL, hInst, NULL); 其中WS_POPUP和hOwnerWnd这里必须要填,WS_POPUP可以是WS_OVERLAPPED属性(因为这样可以创建出一个top-level窗口)

2、parent/child关系的窗口

其实可以将owner/owned看作是一种弱的parent/child关系。所以上面描述的有点,parent/child都有。但parent不需要一定是top-level,所以你的child肯定可以绑定在parent上,而且一定是显示在parent窗口前面,这正是我们想要的。但parent在invalid的时候,会发送repaint消息到child中,由于是D3D窗口(一般在30帧渲染一次,导致窗口invalid),所以一定会导致child窗口不停收到repaint的消息,而出现闪烁的问题。

ms已经想到有这个情况了,所以提供了一个WS_CLIPCHILEDREN的属性,用来设定parent的窗口,这样,parent在invalid的时候,就不会不停地发消息过去了。

所以这里也需要注意了,这个child窗口的渲染,必须你自己来管理,如果你依赖parent窗口invalid的时候刷新的话,那么不好意思,肯定有BUG了

3、top-most窗口

这个不用多说了吧,在SetWindowPos的时候可以设定的,不同通常用在全屏是,其他情况应该很少用到

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Window 窗口属性及嵌入窗口到D3D渲染窗口顶层 的相关文章

  • 移动/调整窗口大小时闪烁

    我开发了一个显示 jpeg 图像的应用程序 它可以显示 4 个图像 屏幕的每个象限各一个 为此 它使用了 4 个窗口 窗口没有边框 框架 也没有标题栏 当加载新图像时 窗口大小会根据新图像进行调整 然后显示该图像 尤其是当窗户做得较大时 经
  • 检测计算机何时解锁 Windows

    我用过这个优秀的方法 https stackoverflow com questions 20733441 lock windows workstation using python 20733443锁定 Windows 计算机 那部分工作
  • Qt(在 Windows 上)将权限级别设置为“requireAdministrator”

    我正在使用 Qt Creator 并努力制作 exe文件默认以管理员身份运行 在线阅读所有解决方案我试图将这一行放入我的 pro file QMAKE LFLAGS MANIFESTUAC level requireAdministrato
  • 以编程方式从 java 代码中查找 java.exe 的绝对路径

    如果我有一个由用户启动的 java jar 或类文件 假设在环境变量中设置了 java 路径 那么我如何从代码中找出 java exe javaw exe 的绝对路径文件正在启动 就像在 ubuntu 上一样 我们可以运行 which ja
  • 设置 Form.KeyPreview = true 的缺点?

    我想知道 Form KeyPreview 属性实际上有什么用处 它为什么存在以及将其设置为 true 会带来什么 风险 我想它一定有some负面影响 否则它根本不应该存在 或者至少默认情况下是正确的 EDIT 我很清楚what确实如此 我问
  • 如何在批处理文件中回显换行符?

    如何从批处理文件输出中插入换行符 我想做类似的事情 echo hello nworld 这会输出 hello world Use echo hello echo echo world
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • Windows 目录永远不会包含临时文件的非 ASCII 字符?

    在 Windows 上使用 MinGW 7 3 0 由于 Windows 限制 Hunspell 无法从包含非 ASCII 字符的位置加载字典文件 我已经尝试了所有方法 1 现在我将文件复制到没有 ASCII 字符的路径 然后再将其交给 H
  • Windows 操作系统中 ST_INO(os.stat() 输出)的含义

    谁能告诉我这个值的含义是什么st ino是跑步时os stat 在 Windows 上 Python 3 5 3 在早期的 Python 版本中 它包含虚拟值 但最近发生了变化 我找不到它是如何计算 生成的 我怀疑它因文件系统 NTFS F
  • 关闭有效句柄时,AppVerifier 报告“无效句柄 - 代码 c0000008”

    我有一个简单的测试程序 在运行时会失败并出现异常AppVerifier 程序重复STD INPUT HANDLE然后尝试使用关闭它CloseHandle 该程序运行良好 无需AppVerifier返回TRUE for CloseHandle
  • Sencha Cmd 5 + Java 8 错误

    在我的 Windows 构建服务器上安装 Java 8 JDK 后 执行以下命令时遇到以下错误sencha命令 C gt sencha Error Registry key Software JavaSoft Java Runtime En
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • 在有或没有 UNICODE 支持的情况下,如何在我的程序中使用 _stprintf?

    微软的 定义 stprintf as swprintf if UNICODE被定义 并且sprintf如果不 但这些函数采用不同的参数 在swprintf 第二个参数是缓冲区大小 但是sprintf没有这个 有人偷懒了吗 如果是这样 这就是
  • 获取自动热键中的可用屏幕区域

    我正在尝试编写一些简单的 AutoHotkey 脚本来移动窗口 但在获取正确的屏幕尺寸值时遇到问题 我试图获取屏幕上可用区域的大小 通常是全屏分辨率减去任务栏 也许还有任何其他停靠窗口 如 Vista 中的侧边栏 我发现的获取屏幕宽度的方法
  • Windows 10 上的 LibPNG 构建问题

    我试图在 Windows 10 上构建 libpng 以获取 win32 二进制文件 但我认为有一个与 awk 解析带有 CRLF 行结尾的文件相关的问题 我尝试使用 dos2unix 命令转换文件 但没有成功 结果相同 在 make 命令
  • 如何迭代所有注册表项?

    我正在尝试迭代所有注册表项以查找 包含 并删除 jre1 5 0 14 值 有办法做到吗 下面的代码只是在特定键下找到jre1 5 0 14 我确实想迭代所有的键 顺便说一句 if 子句获取是否等于 jre1 5 0 14 但如果它包含 j
  • 生成尽可能最快的可执行文件

    我有一个非常大的程序 我一直在 Visual Studio 下编译 v6 然后迁移到 2008 我需要可执行文件尽可能快地运行 该程序大部分时间都花在处理各种大小的整数上 并且执行很少的 IO 显然 我会选择最大优化 但似乎可以做很多不属于
  • 将 value 转换为 bool 的魔法

    今天我意识到将值转换为 bool 是一种魔法 int value 0x100 unsigned char uc static cast
  • SetWindowsHookEx 函数返回 NULL

    我正在研究 DLL 注入 但收到错误如下 挂接进程失败 87 参数不正确 目标进程和dll都是64位的 注入代码为 BOOL HookInjection TCHAR target TCHAR dll name https msdn micr
  • 将 OpenBLAS 链接到 MinGW

    我正在尝试链接OpenBLAS https www openblas net 图书馆与明GW w64 https mingw w64 org Windows 上的编译器 这是我的代码 include

随机推荐

  • java基础笔记

    java基础自学笔记 前言 一 java的一些基本规则 二 java的面向对象基础 三 抽象 接口 异常基础 接口 匿名类 异常 四 java的gui基础 一 图形界面 二 主要包 三 窗体类 方法 四 布局管理器 方法 BordLayou
  • 【转载】What does MULx operation in SNOW 3G correspond to?

    https crypto stackexchange com questions 72538 what does mulx operation in snow 3g correspond to According to the spec M
  • ENVI入门系列教程---二、图像分析---11.分类后处理

    every blog every motto Live beautifully dream passionately love completely https blog csdn net weixin 39190382 type blog
  • 嵌入式Linux移植0.嵌入式开发环境配置综述

    在开发板上进行Linux开发不同于Ubuntu 需要在PC上开发后编译 移进板子进行执行 因此会设计到各种开发工具 如NFS TFTP服务 QT环境配置 交叉编译器的配置等等 目前刚安装完QT开发环境并且测试通过 虽局限于飞凌的OK335x
  • P1853 守望者的逃离

    include
  • 计算机视觉与智能语音处理融合套件初体验(语音部分)

    本次实验我们使用的是EAIDK计算机视觉 语音处理套件试验箱进行实验 套件介绍 套件简介 EAIDK计算机视觉 语音实验箱以嵌入式人工智能开发套件EAIDK 610为核心 具备语音 视觉等传感器数据采集能力 及适用于多场景的运动控制接口 预
  • C语言---离散数学实验--命题逻辑及其应用(实验报告下载)

    目录 下载链接 设计一个5人表决开关电路 代码实现 确定谁是作案者 代码实现 下载链接 链接 https pan baidu com s 1nDnISBjZjbD6Bf4qqzICsw pwd 1234 提取码 1234 设计一个5人表决开
  • VUE前端实现token的无感刷新

    前言 说实话 这个其实没啥好讲的 要说有复杂度的话 也主要是在后端 实现token无感刷新对于前端来说是一项十分常用的技术 其本质都是为了优化用户体验 当token过期时不需要用户调回登录页重新登录 而是当token失效时 进行拦截 发送刷
  • Spring Boot 整合MyBatis 和 Spring Boot 整合MyBatis-Plus

    目录 Spring Boot 整合MyBatis 代码 配置实现 创建数据库和表 使用灵活的方式创建maven 创建resources application yml 配置数据源参数 并完成Spring Boot 项目启动测试 测试Drui
  • 5种获取JavaScript时间戳函数的方法

    来源 https www fly63 com 一 JavasCRIPT时间转时间戳 JavaScript获得时间戳的方法有五种 后四种都是通过实例化时间对象new Date 来进一步获取当前的时间戳 JavaScript处理时间主要使用时间
  • 排序算法整理

    冒泡排序 bubble sort public static void bubbleSort int array int n int i 0 loop int j 0 element index while i lt n for j 0 j
  • xshell的快捷键

    删除 ctrl d 删除光标所在位置上的字符相当于VIM里x或者dl ctrl h 删除光标所在位置前的字符相当于VIM里hx或者dh ctrl k 删除光标后面所有字符相当于VIM里d shift ctrl u 删除光标前面所有字符相当于
  • Linux网络管理-配置网卡

    目录 一 概念 二 配置网卡 2 1 命令行配置 2 1 1 查询网卡 2 1 2 配置网卡 2 2查询IP地址 2 3 查询DNS 三 配置两台机器通信 3 1 查看参数 3 2 进入配置环境 3 3 重启网卡 四 主机改名 五 重点 扩
  • ChatGPT写文书再次翻车,行文寡淡没有灵魂一眼假!

    留学申请文书是每个渴望出国深造的学子都会面临的一道门槛 近年来 随着人工智能ChatGPT的迅猛发展 文能写文章 武能改Bug AI代写留学文书逐渐成为一种趋势 不少人直呼申请文书有救了 然而 这种趋势是否真的有益呢 或许 我们应该对这种现
  • ‘sleep_for’ is not a member of ‘std::this_thread’ 报错是因为版本太低

    1 GCC编译器 从编译器GCC4 8 X的版本完全支持 1 目前C 11特性 之前成为C 0X特性 从GCC4 3的后续版本中逐步对C 11进行支持 2 从官方信息可以看到 目前从完全对C 11特性进行支持的是从编译器GCC4 8 X的版
  • 虚拟数字人和GPT-4的结合,能否迎来新爆发?

    最近 ChatGPT一直在互联网上狂飙 从 去年11月底推出到月活过亿 仅花了2个月的 时间 它既可以拥有美国的医学牌照 参加司法考试 又能写小说 编代码 查资料 还可 以陪你闲聊 你问它什么话题 它都能对答如流 有模有样 3月13日 Ch
  • python模块openpyxl常用指令

    1 加载xlsx文件 from openpyxl import load workbook wb load workbook xlsx file 2 获取加载xlsx文件有哪些sheets 1 遍历方法 for sheet in wb pr
  • 【软件教程】如何让vscode连接ssh时免密登录

    准备软件 客户机安装vscode vscode官网https code visualstudio com 客户机和服务器配置ssh 确保能够连接 VSCode ssh免密登录教程 一 在Client客户机生成ssh密钥对 打开客户机的cmd
  • bat获取所有的参数

    bat默认只能获取到1 9个参数 分别用 1 2 9引用 如果传给bat的参数大于9个 就必须用shift 工作需要 要写个bat脚本 获取所有的参数 再将所有的参数传给Java 代码如下 allparam就是获取到的所有参数字符串 ech
  • Window 窗口属性及嵌入窗口到D3D渲染窗口顶层

    Window窗口有很多属性 可以通过设定window的style和ex style中知道 这些属性有时候在实现某些效果的时候 是非常非常重要 以前都没有怎么详细了解 只是在用到对应的API时看一下 根本没有详细深入 这里想记录一下最近工作上