0
Win32 API를 사용하여 텍스트를 클립 보드에 쉽게 복사 할 수 있지만 디스크 (예 : D : \ 1.jpg)에서 클립 보드로 그림을 복사하려고합니다.win32를 사용하여 디스크의 그림을 클립 보드에 복사하는 방법은 무엇입니까?
많은 웹 페이지를 검색하는데 유용한 정보가 없습니다. 어떻게하는지 가르쳐주세요.
MFC가 없습니다.
Win32 API를 사용하여 텍스트를 클립 보드에 쉽게 복사 할 수 있지만 디스크 (예 : D : \ 1.jpg)에서 클립 보드로 그림을 복사하려고합니다.win32를 사용하여 디스크의 그림을 클립 보드에 복사하는 방법은 무엇입니까?
많은 웹 페이지를 검색하는데 유용한 정보가 없습니다. 어떻게하는지 가르쳐주세요.
MFC가 없습니다.
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);
}
일부 오류 검사로 인해 문제가 발생하지 않습니다. –
@JonathanPotter Gdi +가 이미지를 성공적으로로드하면 'GetHBITMAP','GetObject' 및'SetClipboardData'가 괜찮을 것이라고 가정했습니다. 아니면 나쁜 가정입니까? 'GetObject'가 비판적으로 보입니다. 오류 검사를 추가했습니다. –