如何使用 win32 将磁盘中的图片复制到剪贴板?
How to copy a picture from disk into the clipboard with win32?
用win32复制文本到剪贴板很容易API,但我想从磁盘(例如D:\1.jpg)复制一张图片到剪贴板
我搜索了很多网页,但找不到有用的东西。
请教我怎么做。
而且没有 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);
}
用win32复制文本到剪贴板很容易API,但我想从磁盘(例如D:\1.jpg)复制一张图片到剪贴板
我搜索了很多网页,但找不到有用的东西。 请教我怎么做。
而且没有 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);
}