Преобразовать вектор & lt; unsigned char & gt; в HBITMAP в переполнении стека

Я использовал код Вот загрузить изображение PNG в необработанный вектор BMP std::vector <unsigned char>, Теперь мне нужно применить это изображение в качестве фона для окна WinAPI, и я не знаю, как я могу преобразовать его в HBITMAP, Может быть, кто-то делал это раньше или, может быть, я мог бы использовать другой формат или тип переменной

1

Решение

Вы можете использовать Gdiplus с самого начала, чтобы открыть файл PNG и получить HBITMAP справиться

//initialize Gdiplus:
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

HBITMAP hbitmap;
HBRUSH hbrush;

Gdiplus::Bitmap *bmp = Gdiplus::Bitmap::FromFile(L"filename.png");
bmp->GetHBITMAP(0, &hbitmap);
hbrush = CreatePatternBrush(hbitmap);

//register classname and assign background brush
WNDCLASSEX wcex;
...
wcex.hbrBackground = hbrush;

CreateWindow...

Очистка:

DeleteObject(hbrush);
DeleteObject(hbitmap);

delete bmp;

Gdiplus::GdiplusShutdown(gdiplusToken);

Вам необходимо включить «gdiplus.h» и ссылку на библиотеку «gdiplus.lib». Заголовочные файлы должны быть доступны по умолчанию.

В Visual Studio вы можете создать ссылку на Gdiplus следующим образом:

#pragma comment( lib, "Gdiplus.lib")

редактировать

или использовать Gdiplus::Image в WM_PAINT

Gdiplus::Image *image = Gdiplus::Image::FromFile(L"filename.png");

WM_PAINT в оконной процедуре:

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);

if (image)
{
RECT rc;
GetClientRect(hwnd, &rc);
Gdiplus::Graphics g(hdc);
g.DrawImage(image, Gdiplus::Rect(0, 0, rc.right, rc.bottom));
}

EndPaint(hwnd, &ps);
return 0;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]