如何将GDI + Bitmap放到剪贴板上?

时间:2016-02-02 13:32:51

标签: winapi gdi+ clipboard

我想在剪贴板上放置一个GDI + 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中:

enter image description here

那么,填写函数的正确代码是什么:

void PlaceBitmapOnClipboard(Bitmap image)
{
   //TODO: Ask Stackoverflow to figure this out

}

1 个答案:

答案 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);
}