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

简单说这个 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. 记录--使用率比较低的10个Web API

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 avaScript中有些API可能使用率比较低,下面我们逐一介绍它们的用法和使用场景. 至于标题,主要是想让你进来看看,兄弟们别打我! B ...

  2. 一个可以让你有更多时间摸鱼的WPF控件(一)

    前言 我们平时在开发软件的过程中,有这样一类比较常见的功能,它没什么技术含量,开发起来也没有什么成就感,但是你又不得不花大量的时间来处理它,它就是对数据的增删改查.当我们每增加一个需求就需要对应若干个 ...

  3. https://codeforces.com/gym/496137

    AB略. C:想复杂了. 只要判断最大的那个能不能继续吃即可. D:我的做法是建完全图然后跑生成树. 实际上可以这么考虑:和a[1]不同的直接连,相同的就和上一轮和a[1]不同的店去连可以O(n). ...

  4. 第十三届蓝桥杯大赛软件赛省赛【Java 大学B 组】试题C: 字符统计

    1 import java.util.Scanner; 2 3 public class Main { 4 public static void main(String args[]) { 5 Sca ...

  5. Tomcat内存马分析

    前言 自己简单搭建一个Tomcat项目,IDEA里选择JavaEE,勾上web就行了 加个依赖(这样就能找到三个Context了: <dependency> <groupId> ...

  6. #杜教筛,欧拉函数,整除分块#HDU 6683 Rikka with Geometric Sequen

    题目 由\(1,2,\dots,n-1,n\)组成的序列中有多少个子序列是等比数列\((n\leq 5*10^{17})\) 分析 分类讨论,先设公比为\(q=\frac{i}{j}[gcd(i,j) ...

  7. C# 通过ARP技术来观察目标主机数据包

    由于之前写的C# 实现Arp欺诈的文章属于网络攻击,不能够被展示,所以这边我们稍微说一下C#调用ARP包以及查看其他电脑上网数据包的技术,委婉的说一下ARP在局域网之中的应用. 本文章纯属技术讨论,并 ...

  8. BTC的数据结构

    区块链是一个个block所构成的链,或者链表状的数据结构,在比特币中或者区块链中,一个重要的组成部分是哈希指针 指针 在程序运行过程中,需要用到数据.最简单的是直接获取数据,但当数据本身较大,需要占用 ...

  9. 重新点亮shell————sed其他命令[十一]

    前言 简单介绍一下其他增删查. 正文 删除命令: 例子: 插入和更改: 例子i: 例子c: 读文件和写文件: 例子r: 下一行命令: 打印: 例子: 只想输出匹配的行: 退出命令: 前面的运行效率更高 ...

  10. 微信小程序,本地和真机测试都是好的,但体验版扫码显示空白页

    大概率是缓存导致的,删除掉你手机上的小程序[开发版] 和 [体验版],然后再扫码进入体验版就好了.