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渲染窗口顶层 的相关文章

随机推荐

  • 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时看一下 根本没有详细深入 这里想记录一下最近工作上