2016-08-29 3 views
0

Это легко скопировать текст в буфер обмена с помощью API win32, но я хочу скопировать изображение с диска (например, D: \ 1.jpg) в clipborad.Как скопировать изображение с диска в буфер обмена с win32?

Я ищу множество веб-страниц, и я не могу найти что-то полезное. Пожалуйста, научите меня, как это сделать.

И не MFC.

ответ

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); 
} 
+0

Некоторая проверка ошибок не повредит. –

+0

@JonathanPotter Я предположил, что если Gdi + загружает изображение успешно, тогда 'GetHBITMAP',' GetObject' и 'SetClipboardData' будет в порядке. Или это плохое предположение? 'GetObject' выглядит критически важным, я добавил ошибку для этого. –

Смежные вопросы