如何使用win32将图片从磁盘复制到剪贴板?

Jos*_*hou 1 clipboard winapi

使用 win32 API 将文本复制到剪贴板很容易,但我想将磁盘上的图片(例如 D:\1.jpg)复制到剪贴板。

我搜索了很多网页,但找不到有用的东西。请教我该怎么做。

而且没有MFC。

Bar*_*ani 5

您可以使用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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,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);
}
Run Code Online (Sandbox Code Playgroud)