2016-08-29 22 views

回答

3

您可以使用Gdi+加載圖像,獲取HBITMAP,並設置剪貼板數據。 Gdi +僅適用於Unicode,因此如果使用舊的ANSI函數,則必須將文件名轉換爲寬字符。例如,在C++:

bool copyimage(const wchar_t* filename) 
{ 
    bool result = false; 
    Gdiplus::Bitmap *gdibmp = Gdiplus::Bitmap::FromFile(filename); 
    if (gdibmp) 
    { 
     HBITMAP hbitmap; 
     gdibmp->GetHBITMAP(0, &hbitmap); 
     if (OpenClipboard(NULL)) 
     { 
      EmptyClipboard(); 
      DIBSECTION ds; 
      if (GetObject(hbitmap, sizeof(DIBSECTION), &ds)) 
      { 
       HDC hdc = GetDC(HWND_DESKTOP); 
       //create compatible bitmap (get DDB from DIB) 
       HBITMAP hbitmap_ddb = CreateDIBitmap(hdc, &ds.dsBmih, CBM_INIT, 
        ds.dsBm.bmBits, (BITMAPINFO*)&ds.dsBmih, DIB_RGB_COLORS); 
       ReleaseDC(HWND_DESKTOP, hdc); 
       SetClipboardData(CF_BITMAP, hbitmap_ddb); 
       DeleteObject(hbitmap_ddb); 
       result = true; 
      } 
      CloseClipboard(); 
     } 

     //cleanup: 
     DeleteObject(hbitmap); 
     delete gdibmp;    
    } 
    return result; 
} 

注意,微軟建議使用CF_DIB設置位圖剪貼板數據,但是,這並不與GDI +的工作。此示例使用CF_BITMAP代替。

Gdi +使用標準GdiPlus.lib庫。它需要被初始化如下:

#include <Windows.h> 
#include <GdiPlus.h> 

#pragma comment(lib, "GdiPlus")//Visual Studio specific 

bool copyimage(const wchar_t* filename); 

int main() 
{ 
    //initialize Gdiplus once: 
    Gdiplus::GdiplusStartupInput gdiplusStartupInput; 
    ULONG_PTR gdiplusToken; 
    Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); 

    copyimage(L"d:\\1.jpg"); 

    Gdiplus::GdiplusShutdown(gdiplusToken); 
} 
+0

一些錯誤檢查不會傷害。 –

+0

@JonathanPotter我假設如果Gdi +成功加載圖像,那麼'GetHBITMAP','GetObject'和'SetClipboardData'就沒問題。或者這是一個糟糕的假設? 'GetObject'看起來很關鍵,我爲此添加了錯誤檢查。 –

相關問題