我已使用代码here将PNG图像加载到BMP原始向量std::vector <unsigned char>
中。现在,我需要将此图像作为背景应用于WinAPI窗口,我不知道如何将其转换为HBITMAP
。也许有人之前做过,或者我可以使用其他格式或变量类型
答案 0 :(得分: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);
你需要包含&#34; gdiplus.h&#34;并链接到&#34; gdiplus.lib&#34;图书馆。默认情况下,头文件应该可用。
在Visual Studio中,您可以按如下方式链接到Gdiplus:
#pragma comment( lib, "Gdiplus.lib")
<小时/> 编辑
或在Gdiplus::Image
WM_PAINT
Gdiplus::Image *image = Gdiplus::Image::FromFile(L"filename.png");
Window过程中的 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;
}