我想在剪贴板上放置一个GDI + Bitmap
。显而易见的方法是:
Bitmap.GetHBITMAP
创建HBITMAP
SetClipboardData
将HBITMAP
作为CF_BITMAP
所以我尝试伪代码:
void PlaceBitmapOnClipboard(Bitmap image)
{
//Convert GDI+ Bitmap to GDI Bitmap
HBITMAP bmp;
image.GetHBITMAP(0, @bmp);
OpenClipboard(this.Handle);
EmptyClipboard();
SetClipboardData(CF_BITMAP, bmp);
CloseClipboard();
}
出于说明目的,省略了错误检查;但两种功能都没有失败:
GetHBITMAP
及其HRESULT
样式错误SetClipboardData
也不会返回null
但是当我尝试在剪贴板上使用 CF_BITMAP
时,它无法粘贴到Paint中:
那么,填写函数的正确代码是什么:
void PlaceBitmapOnClipboard(Bitmap image)
{
//TODO: Ask Stackoverflow to figure this out
}
答案 0 :(得分:1)
Gdiplus提供DIB ditmap的句柄。并不像将格式更改为SetClipboardData(CF_DIB, hbitmap)
那么简单。必须将位图转换为DDB:
Gdiplus::Bitmap *gdibmp = Gdiplus::Bitmap::FromFile(L"c:\\test\\test.bmp");
HBITMAP hbitmap;
gdibmp->GetHBITMAP(0, &hbitmap);
if (OpenClipboard(hwnd))
{
EmptyClipboard();
DIBSECTION ds;
GetObject(hbitmap, sizeof(DIBSECTION), &ds);
//make sure compression is BI_RGB
ds.dsBmih.biCompression = BI_RGB;
//Convert DIB to DDB
HDC hdc = GetDC(NULL);
HBITMAP hbitmap_ddb = CreateDIBitmap(hdc, &ds.dsBmih, CBM_INIT,
ds.dsBm.bmBits, (BITMAPINFO*)&ds.dsBmih, DIB_RGB_COLORS);
ReleaseDC(NULL, hdc);
SetClipboardData(CF_BITMAP, hbitmap_ddb);
CloseClipboard();
DeleteObject(hbitmap_ddb);
}