2016-08-29 23 views
0

win32 APIを使用してテキストをクリップボードに簡単にコピーできますが、ディスク(たとえば、D:¥1.jpg)からクリップボラドに画像をコピーしたいとします。win32でディスクからクリップボードに画像をコピーするには?

私は多くのウェブページを検索して、何か有用なものを見つけることができません。 どうすればいいか教えてください。

MFCはありません。

答えて

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

注:Microsoftは、ビットマップ、クリップボードのデータを設定する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'が重大に見えるので、エラーチェックを追加しました。 –

関連する問題