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

时间:2016-08-29 07:27:17

标签: winapi clipboard

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

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

没有MFC。

1 个答案:

答案 0 :(得分: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);
}