【问题标题】:Copy contents of one DeviceContext to another DeviceContext将一个 DeviceContext 的内容复制到另一个 DeviceContext
【发布时间】: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_PAINTDefWindowProc 处理程序在我复制后只是将窗口涂成白色。
  • 是的,这应该在WM_PAINT
  • @cplusplus,是的,您当然需要在 WM_PAINT 中绘制窗口,否则 defwindowproc 会为您绘制...您还需要重新验证窗口,以防止它被多次调用。
  • 另外,您实际上需要在从中复制的位图上有一些东西......如果您复制一个空位图,您将看不到任何东西。另外我假设 SourceDC 是一个内存 DC???
  • 你为什么要选择一个位图到目标 DC?你不能直接Blt到DC上吗?还可以考虑创建内存 DC 和关联的位图,并将其永久保存。当 DD 表面发生变化时,您可以将其复制到内存 DC/位图,在 WM_PAINT 中您可以将其从内存 DC 复制到窗口 DC。

标签: c++ winapi gdi


【解决方案1】:

从一个 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

【讨论】:

    【解决方案2】:

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

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

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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多