Windows 机密 一直光标的用例

Raymond Chen

您可能已经注意到 当您按 PrtSc 键才能屏幕快照时,光标闪烁简要。 无论您相信与否,它实际实现此 Windows XP fade-out 关机屏幕没有半透明 Windows 原因。

称为分层 Windows,这些半透明窗口不通常包含由 bitblt 函数从屏幕读取像素时。 要获取这些,必须传递 CAPTUREBLT 标志。 执行时, 您可能还注意到鼠标光标闪烁。 那么为什么是的呢?

一次 upon 一次,浮动"above"屏幕上的对象的其余部分只图形对象时将鼠标光标。 最初,系统支持仅单色的鼠标光标。 支持这些游标在软件或者,您发生了变化的出色的视频卡采用硬件。

使用视频卡支持游标时, 图形设备接口 (GDI) 将使视频卡,一个位图和掩码,并指出,确定",这是将鼠标光标。 覆盖此我指定的坐标处在屏幕上"。 当用户在移动鼠标时则 GDI 发送更新的视频卡的坐标,并视频卡执行移动在屏幕像素的硬盘工作。

而在另一方面,当您使用支持软件的游标,然后 GDI 负责前其绘制到帧缓冲区保存在光标下的像素。 该过程有效按以下方式: 用户移动鼠标时, GDI 手动恢复原始像素为单位保存像素游标的新的位置下的所有,然后绘制光标在该新位置。

硬件游标采用时, 鼠标光标的像素并不实际存在于帧缓冲区因为硬件负责执行覆盖。 因此,bitblt 功能是可以只复制像素从帧缓冲区不担心选择鼠标光标像素错误地因为这些像素不存在帧缓冲区中开始。

相反,如果正在使用软件游标,然后 GDI 必须删除鼠标指针从屏幕从屏幕中执行一个 bitblt 如果被复制到区域重叠鼠标光标之前。

动画的光标都采用了时, 硬件光标只是不要非常剪切该的 mustard 由于硬件光标不动画显示。 因此,软件中实现动态的光标。

确定,大。 但这有与 CAPTUREBLT 会? 在挂起,我没有收到。

在 Windows 2000 中用于软件游标复合机制被通用化这样应用程序可能还利用它。 这些 pseudo-cursors 最终被称为分层的 Windows。 像软件的游标分层的 Windows 时不显示设置由于不确实存在通常意义上,从屏幕执行一个 bitblt。 像素从光标和分层的 Windows 位于复合在屏幕上最后一时刻。

但是,如果您想要捕获通过 bitblt 分层窗口的像素? 这是新的 CAPTUREBLT 标记进入播放。 其例如组合引擎后,此捕获像素。 由于生成 Windows XP 为灰色的关机屏幕的代码不会将该 CAPTUREBLT,未显示分层的窗口。

该仍然似乎并没有解释为什么光标闪烁,但。 实际,它实现。 鼠标光标是另一个复合对象,因此将被捕获用 CAPTUREBLT 标志。 若要防止这屏幕捕获时发生,组合引擎必须隐藏光标,执行该的 CAPTUREBLT,然后 re-show 光标。

通过公开应用程序,Windows 2000 组合引擎,游标丢失其特殊的状态。 我们已经有完整 circle。 它现在的只是喜欢好过去,回时必须是帧缓冲区并软件游标。

Raymond Chen Web 站点 旧的新内容和相同的标题为简介册 (Addison-Wesley,2007) 讨论了 Windows 历史、 Win 32 编程和 misreading 报纸标题。