1

我从未做过任何 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

这样做的正确方法是什么?

4

2 回答 2

2

从一个 DC 复制到另一个 DC 唯一需要的是BitBlt. 有效的代码如下。

SIZE srcSize;
// ... Get size of source DC

HDC destDC = ...;   // from GetDC(myWindow), myWindow was
                    // sized before this to properly contain source
HDC sourceDC = ...;

BitBlt(destDC, 0, 0, srcSize.cx, srcSize.cy, sourceDC, 0, 0, SRCCOPY);
//... ReleaseDC()s here
于 2012-05-03T01:23:00.500 回答
0

我不太清楚您要做什么。首先,为什么要创建新位图并将其选择到窗口(对不起,“客户区”)DC 中?您想要的只是绘制/绘制窗口,不是吗?这时候就不需要了。destDC 正是窗口的客户区表面。

sourceDC 真的包含任何东西吗?例如,它是否选择了位图?

当然,您应该处理 WM_PAINT。如果您处理此消息,则会验证窗口,并且您不需要显式验证它。使用 GetDC()/ReleaseDC() 被称为“绘图”,而不是“绘画”。在我过去制作的应用程序中,我必须使用这两种方法,绘画(处理 WM_PAINT)以响应调整大小,退出最小化状态并将窗口置于前台(如果之前被另一个窗口遮挡)和绘图,以立即进行某些更改可见(而不是先使窗口无效并等待应用程序几乎进入空闲状态 - 请注意 WM_PAINT 是低优先级消息)。

希望这可以帮助

于 2012-05-03T16:23:26.800 回答