【发布时间】:2016-09-26 22:50:03
【问题描述】:
尝试将HBITMAP 复制到剪贴板时遇到了一些困难。我的HBITMAP 是从COLORREF 数组创建的,我能够正确显示它。以下是它的创建方式:
COLORREF* colors = new COLORREF[imageSize[0] * imageSize[1]];
for (int i = 0; i < imageSize[1]; i++) {
for (int j = 0; j < imageSize[0]; j++) {
colors[imageSize[0] * i + j] = RGB(/* ... */);
}
}
// Create bitmap
HBITMAP hBitmap = CreateBitmap(imageSize[0], imageSize[1], 1, 32, (void*)colors);
delete[] colors;
为了将我的位图复制到剪贴板,我使用了这段小代码:
OpenClipboard(hWnd);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBitmap);
CloseClipboard();
当我执行我的应用程序时,我可以复制位图并将其粘贴到某处,例如在 MS Paint 中。但是如果我再次尝试复制它,剪贴板内容将无法再粘贴,除非再次执行上面的第一段代码。
在MSDN documentation中,据说
如果SetClipboardData成功,则系统拥有hMem参数标识的对象。
我不明白这到底是什么意思,但我想这是我问题的根源。我找到了一个函数示例,它可以执行我想要的here,但它似乎没有使用相同类型的变量。另一个例子,这次使用字符串,可以找到here。
我不太确定如何将最后一个示例转换为我的案例。你能指出我正确的方向吗?
【问题讨论】:
-
COLORREF用于 RGB 和 RGBA 图像,但这看起来像 32 位灰度图像。然而,我已经很久没有这样做了,我在文档中看不到任何明显的警告。 -
@RemyLebeau 有趣的是,stackoverflow.com/questions/32086618/… 中 OP 的测试结果显然表明系统实际上并不拥有位图的所有权。
-
查看Clipboard Formats 文档中关于
CF_BITMAP的说明。CF_BITMAP是一个 DDB,不能按原样存储,它会被转换并存储为 DIB。