0
win32 APIを使用してテキストをクリップボードに簡単にコピーできますが、ディスク(たとえば、D:¥1.jpg)からクリップボラドに画像をコピーしたいとします。win32でディスクからクリップボードに画像をコピーするには?
私は多くのウェブページを検索して、何か有用なものを見つけることができません。 どうすればいいか教えてください。
MFCはありません。
win32 APIを使用してテキストをクリップボードに簡単にコピーできますが、ディスク(たとえば、D:¥1.jpg)からクリップボラドに画像をコピーしたいとします。win32でディスクからクリップボードに画像をコピーするには?
私は多くのウェブページを検索して、何か有用なものを見つけることができません。 どうすればいいか教えてください。
MFCはありません。
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);
}
いくつかのエラーチェックは害を受けません。 –
@ JonathanPotter Gdi +がイメージを正常に読み込んだ後、 'GetHBITMAP'、' GetObject'、 'SetClipboardData'が正常に動作すると仮定しました。それとも悪い仮定ですか? 'GetObject'が重大に見えるので、エラーチェックを追加しました。 –