我觉得我可以加入历史博物馆了,加入微软历史博物馆,本文也是和大家吹历史的博客

简单说这个 WS_EX_NOREDIRECTIONBITMAP 样式是 Win8 提供的,用来做画面图层混合的功能。什么是画面图层混合功能?详细请看为何使用 DirectComposition

玩法就是系统给你一个绘制表面,你在这个绘制表面上进行绘制,然后 DWM (桌面管理器 DWM Desktop Window Manager) 会拿出你绘制的表面来和其他的应用进行混合

用这个方法和传统的区别是啥?普通的应用是给每个窗口的客户区创建一个重定向表面,这个应用的窗口的所有绘制内容都绘制到这个表面。而通过 DirectComposition 可以让应用自己管理和创建这个重定向表面,而让桌面管理器从应用自己创建的表面进行获取 Bitmap 和其他表面进行混合

这个方式有什么作用?主要作用就是提升性能,将 DX 配合上 DirectComposition 是最无敌的性能

那么什么的软件会用到这个功能?用到这个功能最多的是 UWP 应用,但是经过考古在 Win8 的全屏应用也用到这个技术,在 win32 函数里面的 CreateWindowEx 方法创建窗口的时候,可以通过传入 WS_EX_NOREDIRECTIONBITMAP 参数,这个参数需要传入到扩展样式里面,根据文档说的,添加这个样式之后的应用窗口不呈现到重定向表面。这适用于没有可见内容的窗口,或者使用表面以外的机制来提供其视觉效果的窗口。详细文档请看 Extended Window Styles (Winuser.h) - Win32 apps

如何才能说德熙不是在骗你?创建一个 UWP 应用,然后运行这个应用。打开 spyxx 工具,找到这个窗口,如我创建的 KurdigalbaHercuqeahear 窗口,右击属性就可以看到窗口样式

对于 UWP 应用的实际窗口应该是 Windows.UI.Core.CoreWindow 窗口,右击属性切换到样式就可以看到 UWP 的窗口设置的样式就是 WS_EX_NOREDIRECTIONBITMAP 样式

所有的 UWP 应用都用上了 DirectComposition 技术,此时的 UWP 能够通过 dx 创建多个不同的表面,将内容绘制到表面里面,然后经过 DWM 混合在屏幕显示

这就是 UWP 应用渲染快的一个原因,现在的应用通过 DX 几乎压榨到底了,但是 DX 的渲染不等于屏幕显示,而渲染的延迟就是用户交互到屏幕显示之间。而 DX 到屏幕显示之间就差一个 DWM 桌面窗口管理器的处理,通过 DirectComposition 或者说 Composition API 技术就能做到压榨 DWM 的渲染延迟,降低从 DX 到屏幕显示的时间。当然处理 UWP 之外,使用 WPF 也是可以做到的,请看 WPF 使用 Composition API 做高性能渲染

当然这需要来聊下 DWM 是怎么工作的,从大佬的 Windows with C++ - High-Performance Window Layering Using the Windows Composition Engine 可以了解到,在 Vista 引入的桌面窗口管理器是这样做的,将每个窗口渲染到屏幕外的表面或缓冲区,也就是上文说的普通应用的重定向表面。系统为每个顶级窗口分配一个这样的表面,并且所有GDI,Direct3D以及Direct2D图形都呈现到这些表面。那为什么这个表面叫重定向表面原因是GDI绘图命令甚至Direct3D交换链表示请求都被重定向或通过复制(在GPU内做的)重定向表面

而通过 DirectComposition 则是由软件自己实现管理和创建表面,通过 DWM 调度的是图层合并。对应用来说有更可控和更多的优化空间,可以压榨 DWM 部分的性能。对 DWM 来说,可以通过合成图层的方法方便进行窗口特效处理,如亚克力效果。对其他应用来说,可以通过重定向表面技术,获取其他应用的截图,这对于视频直播软件来说能提升很多性能。关于应用截图请看 win10 uwp 录制任意应用屏幕

本文只是和小伙伴吹这个技术,不会告诉大家实际上应该如何做。每个微软添加的 API 大部分都是有历史原因的,为什么添加这个 API 解决什么问题,大概都是遇到某个问题,但是正经解决方案解决不了,因为有历史原因,所以换了一个咱看起来很诡异的方法解决

Extended Window Styles (Winuser.h) - Win32 apps

Windows with C++ - High-Performance Window Layering Using the Windows Composition Engine

Windows 窗口样式 什么是 WS_EX_NOREDIRECTIONBITMAP 样式的更多相关文章

  1. C语言Windows程序开发—Windows窗口样式与常用控件样式【第04天】

    (一)Windows窗口(MDICLIENT)样式介绍 /* Windows窗口样式 */ WS_BORDER //带有边框的窗口 WS_CAPTION //带有标题栏的窗口 WS_CHILD //子 ...

  2. Windows窗口样式速查参考,Delphi窗口控件的风格都有它们来决定(附Delphi何时用到它们,并举例说明)good

    /* 窗口样式参考列表(都是GetWindowLong的GWL_STYLE风格,都是TCreateParams.Sytle的一部分),详细列表如下:https://msdn.microsoft.com ...

  3. win32 htmlayout点击按钮创建新窗口,以及按钮图片样式

    最近在做一个C++ win32的桌面图形程序,我不是C++程序员,做这个只是因为最近没什么java的活. windows api,之前接触的时候,还是大学,那时用这个开发打飞机游戏纯粹是娱乐.现在基本 ...

  4. 按照已有的模板打印小票<二> ——调用windows打印机打印 可设置字体样式

    按照已有的模板打印小票<二> ——调用windows打印机打印 可设置字体样式 之前写过一篇文章<按照已有的模板输出一(如发票)>,是关于如何给已有的模板赋值.在项目的实践过程 ...

  5. 设置windows窗口ICON 【windows 编程】【API】【原创】

    1. ICON介绍 最近开始接触windows 编程,因此将自己所接触的一些零散的知识进行整理并记录.本文主要介绍了如何更改windows对话框窗口的ICON图标.这里首先介绍一下windows IC ...

  6. Windows窗口消息大全(转)

    Windows窗口消息大全,全不全自己看 ////////////////////////////////////////////////////////////////////////// #inc ...

  7. [MFC]_在vs2019中使用MFC快速构建简单windows窗口程序

    微软基础类库(英语: Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发 ...

  8. DOM访问元素样式和操作元素样式

    在HTML中定义样式的方式有三种:通过<link/>元素包含外部样式表文件(外部样式表).使用<style/>元素定义嵌入式样式(嵌入式样式表).使用style特性定义针对特定 ...

  9. 【转】Windows 窗口层次关系

    原文链接:undefined! 相信在Windows 下面编程的很多兄弟们都不是很清楚Windows 中窗口的层次关系是怎么样的,这个东西很久已经研究过一下,后来又忘记了,今天又一次遇到了这个问题,所 ...

  10. JavaScript 学习—— js获取行间样式和非行间样式

    1. 问题引入 <head> <style> #div1{ width:150px; height:200px; position:absolute; left:-150px; ...

随机推荐

  1. 使用systemd部署r-nacos

    1. 前言 r-nacos是一个用rust实现的nacos服务.相较于java nacos来说,是一个提供相同功能,启动更快.占用系统资源更小(初始内存小于10M).性能更高.运行更稳定的服务. r- ...

  2. LOTO示波器参加2023第101届中国(深圳)电子展

    西安乐拓精益信息科技有限公司,专注研发虚拟测量仪器,以虚拟示波器(USB示波器)以及相关衍生产品为主,包括信号发生器,逻辑分析仪等.乐拓科技以研发团队为核心,着力开发高性价比的示波器产品.无论您是资深 ...

  3. spring boot @Scheduled 单线程的问题

    package com.lxw.lxwDemo; import org.springframework.scheduling.annotation.EnableScheduling; import o ...

  4. KingbaseESV8R6识别IO使用率过高

    前言 数据库正常运行离不开I/O的使用,在操作系统上,I/O又离不开存储的性能及使用方式,我们可以在存储层利用raid条带化技术使IOPS达到最佳性能. 本篇文章有助于确认数据库I/O使用率过高的原因 ...

  5. Ohos-MPChart——支持多种图表绘制的组件

    简介 Ohos-MPChart是OpenAtom OpenHarmony(简称"OpenHarmony")系统显示各种图表视图的三方组件,用于声明式应用开发,提供了多种多样的图表视 ...

  6. C++ 用户输入与数据类型详解:建立基本计算器及变量类型

    C++ 用户输入 你已经学习了 cout 用于输出(打印)值.现在我们将使用 cin 来获取用户输入. cin 是一个预定义变量,它使用提取运算符(>>)从键盘读取数据. 在下面的示例中, ...

  7. 了解 Spring MVC 架构、Dispatcher Servlet 和 JSP 文件的关键作用

    Spring MVC 是 Spring 框架的一部分,是一个 Web 应用程序框架.它旨在使用 Model-View-Controller(MVC) 设计模式轻松构建Web应用程序. Spring M ...

  8. C# 中一维数组和二维数组详解

    String[][]是二维数组.例如:String[][] str=new String[4][4],这是创建了一个有bai4行4列元素的数组. String[]代表一维数组.例如:String[]  ...

  9. 干货分享|身为顶尖的Hr,这个Excel插件你不能不知道,用上它事业开挂!

    第一季度,老板看了历年不同地区各销售业绩数据表的总结,说想知道新人进来多久才能成为成熟的销售,成长周期有多长? 我们人事被老板这个灵光一现的想法吓到了,大家伙上上下下为这件事情忙了4个日夜. 整整五年 ...

  10. k8s之helm部署mysql集群

    一.简介 Helm Helm 是 Kubernetes 的包管理器. Chart Helm使用的包格式称为 chart.chart存储在Chart Repository. chart就是一个描述Kub ...