关于 LockWindowUpdate 的最终总结

经过前面两篇文章的”洗礼”,我想,你应该知道了在何种情况下应该使用 LockWindowUpdate。
但接下来我要告诉你的是为什么不能使用它,即使是用于它本身的预期目的。

让我们回到古老的旧时代,那个时候,LockWindowUpdate 刚刚被创建出来。

在 16 位 Windows 年代,特别是 Windows 3.1 版本时期,内存是昂贵的。视频驱动程序的功能非常有限,当时还没有 DirectX,也没有 AlphaBlend 函数。

你所拥有的只是一个屏幕缓冲区。LockWindowUpdate 函数允许您控制该屏幕缓冲区的一个窗口部分,以便您可以在该窗口不知情的情况下将花哨的效果应用于该窗口。

自 Windows 3.1 以来已经十多年了,与此同时,我们获得了 DirectX 覆盖、区域窗口、分层窗口、Alpha 混合、桌面合成以及各种很酷的图形效果,这些都是过去不可用的。
特别是,这些分层窗口和区域窗口几乎可以让你做几乎所有你想用 LockWindowUpdate 做的事情。

如果要在窗口周围绘制高亮显示,可以在窗口周围放置一个区域窗口。如果要在窗口上绘制拖动图像,只需创建分层窗口并将其放置在目标窗口上即可。为分层窗口提供一个区域和您想要的任何花哨的 Alpha 通道,并让图形引擎完成 Alpha 混合和合成的繁重工作。更好的是,分层窗口可以延伸到您拖动的窗口之外,这是 LockWindowUpdate 无法做到的。

(如果您在资源管理器窗口中执行“全选”并在屏幕上拖动整个选择,则可以在 Windows XP 中看到此效果。请注意,拖动图像不受要拖动的窗口边界的约束。

更重要的是,在 Vista 桌面窗口管理器令人兴奋的新复合窗口的世界中,LockWindowUpdate 更是不可取。锁定特定窗口进行更新并不是那么糟糕,因为桌面窗口管理器可以为您提供窗口的支持位图。但是,如果您锁定整个屏幕(我见过人们可能会这样做),桌面窗口管理器需要将所有窗口组合成一个实际的位图,当您使用 DCX_LOCKWINDOWUPDATE 标志调用 GetDCEx 时,它可以为您提供该位图。

桌面窗口管理器在 DirectX 和加速视频驱动程序的帮助下即时进行合成。所有这些合成的结果通常直接进入屏幕,而实际上并不驻留在“复合”位图中。但是,如果您锁定屏幕并要求为其提供 DC,则桌面窗口管理器需要模拟旧行为,并允许您访问代表如果一开始就没有合成会得到的东西。这所带来的性能代价并不便宜。

总结

我不确定这个系列文章是否对你有帮助。我的目标只是帮助人们更有效地使用 LockWindowUpdate,并在 LockWindowUpdate 是不适合这项工作的工具时引导他们选择替代方案。

换句话说,这是一篇关于 LockWindowUpdate 的文章,而不是函数文档。我试图保持轻松的演讲,但我想我的笑话落空了,人们只是把它们当作负面评论的跳板。

特别感谢那些以此为契机抱怨文档的人。我的意思是,呃,如果文档是完美的,我一开始就不会写这个系列。尽管这些人也忽略了阅读所有文档;他们只查看了功能描述页面。

亲爱的开发者,文档不仅仅是枯燥的功能描述!功能说明仅供参考;当你已经知道发生了什么时,你就会去那里,你只需要微调一个细节。真正的学习发生在概述和文章中。如果您想学习如何操作收音机,请不要先阅读原理图。

我认为罗纳德·摩尔(Ronald D. Moore)说的: “你必须足够坚强才能听播客”,应该有着更深层次的含义。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Final remarks on LockWindowUpdate》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/298721.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker、docker-compose 离线安装、shell脚本一键安装、卸载

注:二进制包,与脚本在同级目录 docker 离线安装: 包下载:https://download.docker.com/linux/static/stable/x86_64/ docker_install.sh: #!/bin/bash# 指定 Docker 版本和文件名 DOCKER_VERSION"24.0.7" D…

【InternLM】书生-浦语大模型demo搭建服务接口部署本地映射

目录 前言一、InternLM大模型介绍1-1、大模型简介1-2、InternLM大模型简介1-2-1、InternLM-7B1-2-2、InternLM-20B 二、从0开始搭建InternLM-Chat-7B 智能对话 Demo2-0、环境搭建2-1、创建虚拟环境2-2、导入所需要的包2-3、模型下载2-4、代码克隆2-5、终端运行 三、服务器接口部…

真核微生物基因组质量评估工具EukCC的安装和详细使用方法

介绍: GitHub - EBI-Metagenomics/EukCC: Tool to estimate genome quality of microbial eukaryotes 安装: docker: docker pull microbiomeinformatics/eukcc 推荐conda 环境: conda install -c conda-forge -c bioconda …

Python+Torch+FasterCNN网络目标检测识别

程序示例精选 PythonTorchFasterCNN网络目标检测识别 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《PythonTorchFasterCNN网络目标检测识别》编写代码,代码整洁,规…

Java-网络爬虫(二)

文章目录 前言一、WebMagic二、使用步骤1. 搭建 Maven 项目2. 引入依赖 三、入门案例四、核心对象&组件1. 核心对象SipderRequestSitePageResultItemsHtml(Selectable) 2. 四大组件DownloaderPageProcessorSchedulerPipeline 上篇:Java-网…

物联网的感知层、网络层与应用层分享

物联网的概念在很早以前就已经被提出,20世纪末期在美国召开的移动计算和网络国际会议就已经提出了物联网(Internet of Things)这个概念。 最先提出这个概念的是MIT Auto-ID中心的Ashton教授,他在研究RFID技术时,便提出了结合物品编码、互联网…

打造清晰的日志管理策略:如何在 NestJS 中集成 winston 高级日志系统

前言 在Web应用程序的开发过程中,日志管理是不可或缺的一部分。日志可以帮助我们了解应用程序的运行状态,监控系统行为,以及在出现问题时快速定位和解决问题。 对于使用NestJS框架的项目来说,集成一个高效、可扩展的日志系统尤为…

听GPT 讲Rust源代码--compiler(25)

File: rust/compiler/rustc_target/src/spec/mod.rs 在Rust的源代码中,rust/compiler/rustc_target/src/spec/mod.rs文件的作用是定义和实现有关目标平台的规范。 SanitizerSet是一个结构体,用于表示目标平台上存在的sanitizer集合。 TargetWarnings是一…

基于OpenCV的透视变换

基础概念 透视变换(Perspective Transformation)是仿射变换的一种非线性扩展,是将图片投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。 原理:将二维的图片投影到一个三维视平面上,然后再转换到二维坐标下&#…

Mongodb使用指定索引删除数据

回顾Mongodb删除语法 db.collection.deleteMany(<filter>,{writeConcern: <document>,collation: <document>,hint: <document|string>} ) 删除语法中&#xff0c;除了指定过滤器外&#xff0c;还可以指定写入策略&#xff0c;字符序和使用的索引。 …

《C++语言程序设计(第5版)》(清华大学出版社,郑莉 董渊编著)习题——第2章 C++语言简单程序设计

2-15 编写一个程序&#xff0c;运行时提示输入一个数字&#xff0c;再把这个数字显示出来。 #include <iostream>using namespace std;int main() {// 提示用户输入数字cout << "请输入一个数字: ";// 用于存储用户输入的数字的变量double number;// 从…

Apache Paimon:Streaming Lakehouse is Coming

摘要&#xff1a;本文整理自阿里云智能开源表存储负责人&#xff0c;Founder of Paimon&#xff0c;Flink PMC 成员李劲松&#xff08;花名&#xff1a;之信&#xff09;、同程旅行大数据专家&#xff0c;Apache Hudi & Paimon Contributor 吴祥平、汽车之家大数据计算平台…

Nginx快速入门:worker、master进程的作用和热部署原理(十)

0. 引言 我们通过查询nginx进程&#xff0c;可以发现nginx有两个进程&#xff1a;worker和master。一个程序启动了两个进程&#xff0c;那么这两个进程的作用和区别是什么呢&#xff1f;nginx又是如何利用这两个进程进行工作的呢&#xff1f;nginx不停机热部署又是如何实现的&…

AI绘画Midjourney绘画提示词Prompt大全

一、Midjourney绘画工具 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭…

通俗易懂的15个Java Lambda表达式案例

文章目录 1. **实现Runnable接口**&#xff1a;2. **事件监听器**&#xff08;如Swing中的ActionListener&#xff09;&#xff1a;3. **集合遍历**&#xff08;使用forEach方法&#xff09;&#xff1a;4. **过滤集合**&#xff08;使用Stream API&#xff09;&#xff1a;5. …

OS_lab——bochs源码的编译与安装

1. 实验环境VMware station 15 Ubuntu 14.04.6 32位。2. 实验步骤2.1 安装虚拟机&#xff0c;并在虚拟机根目录下编译并安装bochs环境。 2.2 使用bochs自带工具bximage创建虚拟软驱。 2.3 编写引导程序boot.asm并用nasm编译得到引导文件boot.bin和boot.com。 2.4 修改bochs…

C# Emgu.CV4.8.0读取rtsp流录制mp4可分段保存

【官方框架地址】 https://github.com/emgucv/emgucv 【算法介绍】 EMGU CV&#xff08;Emgu Computer Vision&#xff09;是一个开源的、基于.NET框架的计算机视觉库&#xff0c;它提供了对OpenCV&#xff08;开源计算机视觉库&#xff09;的封装。EMGU CV使得在.NET应用程序…

二刷Laravel 教程(用户注册)总结Ⅳ

一、显示用户信息 1&#xff09;resource Route::resource(users, UsersController); 相当于下面这7个路由 我们先用 Artisan 命令查看目前应用的路由&#xff1a; php artisan route:list 2&#xff09; compact 方法 //我们将用户对象 $user 通过 compact 方法转化为一个关联…

Linux-v4l2框架

框架图 从上图不难看出&#xff0c;v4l2_device作为顶层管理者&#xff0c;一方面通过嵌入到一个video_device中&#xff0c;暴露video设备节点给用户空间进行控制&#xff1b;另一方面&#xff0c;video_device内部会创建一个media_entity作为在media controller中的抽象体&a…

亲,你相信数据吗?

对于这个问题&#xff0c;我们首先要看一下数据的属性&#xff0c;数据本身是中性的&#xff0c;只是信息的一个载体&#xff0c;从这个属性定义来看&#xff0c;我们是不能盲目相信或者不相信数据的。相不相信数据&#xff0c;其实是数据可靠性的问题&#xff0c;而数据可靠性…