首页

CS_SAVEBITS 这个样式有什么作用?  

简单来说,如果你在创建窗口的时候在窗口类中指定了 CS_SAVEBITS 标志,则窗口管理器会尝试保存此窗口所遮盖的区域的位图数据。 但是,这里比较关键的问题是:为什么要这样做?只有明白了这其中的原理,你才会在正确的场合使用它,而不是滥用。 当一个指定了 CS_SAVEBITS 标志的窗口显示在屏幕上时,窗口管理器会保存窗口即将显示的屏幕区域的位图数据。首先,它会要求显卡保存这些位图数据到显存中(...

请将所有未处理的消息传递给 DefWindowProc  

在之前的一篇文章中,我曾提到:如果你希望拒绝一次设备移除查询请求,则需要返回一个特殊的 BROADCAST_QUERY_DENY 值,因为太多的程序开发者认为,他们已经覆盖了所有 Windows 消息的处理了,对于其他的消息,直接返回 0 就可以了。 从那时候开始,操作系统引入了很多新的消息,这些消息中的很大一部分都是在 DefWindowProc 中进行了默认的处理。 时不时的,我会碰到一些应用...

向API添加标志位并不具备扩展性  

之前,我曾提到网络交互中存在的一些兼容性问题,有人提出了他的解决方案:可以在 IShellFolder::EnumObjects 中添加一个标志,来表明调用者是希望使用快速模式的枚举还是慢速模式的枚举。 我想说的是,通过向 API 函数添加一个标志位参数来解决驱动中的问题,从长远来看,并不能对解决问题有帮助。 我们考虑这样一种场景:如果一个视频驱动有 Bug,如果 Windows 想解决的视频驱动...

为什么组合框的大小包括下拉列表的大小?  

最近有很多人对这种现象感到吃惊:当创建一个组合框控件(Combo Box)时(不管是通过 CreateWindow 调用直接进行创建还是通过对话框模板间接创建),我们所指定的控件大小实际上是包含了组合框的下拉列表的,即时这个下拉框在屏幕上没有显示出来,也是如此。这是为什么? 我们先举个例子理解理解。 假设,你希望创建一个高度为 200 个像素的组合框控件,则当它显示出来的时候,它的高度实际上只有 ...

Visual Studio 中的新特性:可视化宏扩展  

今天,我们很高兴地宣布在 Visual Studio 17.7 预览版中推出可视化宏扩展功能。这个新功能通过可视化的方式对宏代码进行逐步扩展。 若要开始使用此功能,请确保你的 Visual Studio 版本更新到最新版本的 Visual Studio 预览版。 下面,我们来看看这个新玩意儿! 可视化宏扩展 在现有版本的 Visual Studio 中已经引入了增强的宏扩展功能。此功能带来了显著的...

Visual Studio 新功能:Include 语句清理  

Visual Studio 17.7 预览版 3 引入了一项新功能,用来提升开发者的生产力。我们很高兴地宣布这项新功能:Include 语句清理,这是一个帮助你维护干净代码的工具。如需使用此功能,请确保更新到最新版本的 Visual Studio 预览版。 Include 语句清理 Visual Studio 现在提供 Include 清理功能,该功能包含两个子功能:1) 删除未使用的头文件 2)...

小细节:窗口的标题栏实际上还包含边框  

有些人可能会注意到这样一个细节:窗口风格标志位 WS_CAPTION 被定义为 WS_BORDER 和 WS_DLGFRAME 的并集,如下图所示: 因为 WS_CAPTION 标志包含了 WS_BORDER 标志,所以,当你获取标题栏相关的信息的时候,它实际上包含了边框。 有时人们不太明白这一点,一遍又一遍地问我这个问题,我不得不继续尝试以不同的方式解释这里面的原理,直到有一天有一个人问了这样...

浅谈无效化一个空窗口的后果  

有时候,你可能会注意到这样一个现象:桌面上的所有窗口都刷新了自身并产生了闪烁。 导致这个现象的原因之一是一个所谓的空句柄窗口 Bug。 如果你研究过 Win32 SDK 编程,则你应该比较熟悉这个函数:InvalidateRect。 调用这个函数可以通知窗口管理器:某个窗口的内容发生了变化,需要重新绘制了。在这个函数中,你还可以传入一个矩形坐标来表明你希望将窗口上的哪个区域标记为无效。 这通常是在...

为什么向导式对话框中的取消按钮始终可用  

PropSheet_SetWizButtons 是一个宏,其定义位于 PRSHT.H 头文件中,实际上,它只是调用了 PostMessage 函数来向目标窗口发送 PSM_SETWIZBUTTONS 这个消息,仅此而已。 如果你亲自上阵体验一番,就会发现有这么一个问题(特性): 使用这个宏,可以设置向导对话框中的绝大多数按钮的状态,如启用或者禁用,但是唯独这个取消的按钮,似乎无论如何,都不能禁用掉...

枚举一个进程中的所有线程  

在 Win32 开发中,如果需要获取程序运行过程中的一些较为底层的信息,你可能需要使用到 Tool Helper 库。但我愿意称之它为 Win32 中的 “害群之马”。何解? Tool Helper 库在 16 位 Windows 时代就已经存在了,这个库主要用来提供一些调试服务,例如获取调用堆栈和枚举系统中的所有内存等。 Win32 的初始版本中,并没有包含它,直到 Wi...