2016-02-02 30 views
2

我想將GDI + Bitmap放到剪貼板上。最明顯的方法是:如何將GDI +位圖放置到剪貼板上?

所以我儘量僞代碼

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(); 
} 

錯誤檢查已被省略˚F或說明目的;但既不是函數失敗:

  • GetHBITMAP及其HRESULT風格誤差
  • 也不SetClipboardData返回null

但是,當我嘗試使用CF_BITMAP剪貼板上,它可以」 t被粘貼到油漆中:

enter image description here

那麼,什麼是正確的代碼填入功能:

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

} 

回答

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); 
} 
+0

代替把DIB部分的依賴於設備的副本,你可能只是把DIB到剪貼板,如果你使用正確的格式。嘗試'SetClipboardData(CF_DIB,hbmp)'。 –

+0

@AdrianMcCarthy大多數繪圖程序不檢查DIB –

+0

剪貼板中的剪貼板將在必要時滿足以下要求CF_DIB和CF_BITMAP之間的轉換。 Microsoft建議在剪貼板上放置DIB以覆蓋依賴於設備的位圖,以避免由於自定義調色板而導致不需要的顏色更改:https://msdn.microsoft.com/en-us/library/windows/desktop/ms649013(v=vs .85).aspx#_win32_Synthesized_Clipboard_Formats –

相關問題