gpt4 book ai didi

c - 为什么这个 BitBlt 示例不再有效?

转载 作者:可可西里 更新时间:2023-11-01 13:51:05 27 4
gpt4 key购买 nike

我目前正在使用 Petzold 的书(第 5 版)回到一些 Windows 编程。我编译了following example使用 BitBlt 但它无法正常工作。

它应该复制 (CxSource, CySource) 大小的窗口图标并将其复制到整个窗口的表面上。实际上,使用 Windows 7 时,窗口下方的位图被获取并复制到绘图表面,即 hdcClient。

我不明白为什么它的行为是这样的,因为很明显传递给 BitBlt 的 DC 是 hdcWindow,它指的是通过当前应用程序的 GetWindowDC(hwnd) 获取的设备上下文。

我首先认为这是由于默认情况下启用了透明模式,但停用它并没有改变任何东西。 BitBlt 似乎总是占用应用程序窗口下方的表面!我不明白! :)任何人都知道为什么它会这样工作以及如何解决它?

最佳答案

自从添加了 DWM(桌面窗口管理器,又名 Aero)后,使用 BitBlt() 制作屏幕截图并没有变得更容易。 Petzold 的示例代码存在一个微妙的计时问题,它使屏幕截图过早。它这样做时 Aero 仍在忙于为框架设置动画,使其淡入视野。因此,您会看到窗口后面的内容,可能已经部分褪色,具体取决于第一个 WM_PAINT 消息生成的速度。

您可以通过禁用效果轻松修复它:

#include <windows.h>
#include <dwmapi.h>
#pragma comment(lib, "dwmapi.lib")

在调用 CreateWindow() 之后:

BOOL disabled = TRUE;
DwmSetWindowAttribute(hwnd, DWMWA_TRANSITIONS_FORCEDISABLED, &disabled, sizeof(disabled));

另一个棘手的细节是 第一个 BitBlt 很重要,DWM 之后返回一个缓存副本,该副本未被动画正确无效。

当您需要属于另一个进程的窗口的屏幕截图时,这会变得更加棘手。但这在 Aero 出现之前就已经是个问题了,您必须等待足够长的时间才能确保 window 完全绘制(paint)。值得注意的可能是 BitBlt() 的性能,由于必须完成从窗口后台缓冲区合成最终图像的工作,它会明显陷入困境。在 SO 有很多关于这个的问题,没有令人满意的答案。

关于c - 为什么这个 BitBlt 示例不再有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48068664/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com