将一个DeviceContext的内容复制到另一个DeviceContext

时间:2012-05-02 03:56:51

标签: c++ winapi gdi

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我不清楚你要做什么。首先,为什么要创建新的位图并将其选入窗口(抱歉,“客户区”)DC?你想要的只是画/画窗户,不是吗?这不是必需的。 destDC正好是窗口的客户区表面。

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

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

希望这有帮助