Я использовал код here для загрузки изображения PNG в вектор BMP raw std::vector <unsigned char>
. Теперь мне нужно применить это изображение в качестве фона для окна WinAPI, и я не знаю, как его преобразовать в HBITMAP
. Может быть, кто-то сделал это раньше, или, может быть, я мог бы использовать другой формат или тип переменнойПреобразование вектора <unsigned char> в HBITMAP в C++
ответ
Вы можете использовать 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...
Cleanup:
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;
}
Есть ли способ установить размер изображения так же, как и окно? – ali
Вы можете установить кисть фона в ноль, а затем нарисовать в 'WM_PAINT', см. Edit. Если вам действительно нужна фоновая кисть, вам нужно изменить размер изображения в WM_SIZE, использовать память dc для изменения размера изображения и т. Д., Чтобы создать новый 'HBITMAP' –
Помогает ли это? http://stackoverflow.com/q/4598872/3747990 – Niall