2016-08-29 3 views

답변

3

Gdi+을 사용하여 이미지를로드하고 HBITMAP을 가져오고 클립 보드 데이터를 설정할 수 있습니다. Gdi +는 유니 코드 전용이므로 이전 ANSI 함수를 사용하는 경우 파일 이름을 와이드 char로 변환해야합니다. C++에서 예 : Microsoft는 비트 맵 클립 보드 데이터를 설정하는 CF_DIB을 사용하는 것이 좋습니다,하지만 그 GDI +에서 작동하지 않는

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_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'가 비판적으로 보입니다. 오류 검사를 추가했습니다. –

관련 문제