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;
}
注意,微軟建議使用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'看起來很關鍵,我爲此添加了錯誤檢查。 –