【发布时间】:2012-05-02 03:56:51
【问题描述】:
我从未做过任何 GDI 编程,尽管在黑暗中拍摄了几张照片并搜索了文档,但我还没有找到将一个 DC 的内容复制到另一个 DC 的正确方法。
我目前拥有的代码如下。我不明白为什么它不起作用(创建后窗口仍然保持空白)。
SIZE srcSize;
// ... Get size of source DC
HDC destDC = ...; // from GetDC(myWindow), myWindow was
// sized before this to properly contain source
HDC sourceDC = ...;
HBITMAP buffer = CreateCompatibleBitmap(sourceDC, srcSize.cx, srcSize.cy);
HGDIOBJ oldObj = SelectObject(destDC, buffer);
BitBlt(destDC, 0, 0, srcSize.cx, srcSize.cy, sourceDC, 0, 0, SRCCOPY);
SelectObject(destDC, oldObj);
DeleteObject(buffer);
//... ReleaseDC()s here
这样做的正确方法是什么?
【问题讨论】:
-
也许我应该补充一点,我没有从
WM_PAINT消息中调用它,并且不在WindowProcedure 中处理它,我应该覆盖它吗?可能是WM_PAINT的DefWindowProc处理程序在我复制后只是将窗口涂成白色。 -
是的,这应该在
WM_PAINT。 -
@cplusplus,是的,您当然需要在 WM_PAINT 中绘制窗口,否则 defwindowproc 会为您绘制...您还需要重新验证窗口,以防止它被多次调用。
-
另外,您实际上需要在从中复制的位图上有一些东西......如果您复制一个空位图,您将看不到任何东西。另外我假设 SourceDC 是一个内存 DC???
-
你为什么要选择一个位图到目标 DC?你不能直接Blt到DC上吗?还可以考虑创建内存 DC 和关联的位图,并将其永久保存。当 DD 表面发生变化时,您可以将其复制到内存 DC/位图,在 WM_PAINT 中您可以将其从内存 DC 复制到窗口 DC。