在C ++中将vector <unsigned char =“”>转换为HBITMAP

时间:2016-02-18 09:12:04

标签: c++ vector hbitmap

我已使用代码here将PNG图像加载到BMP原始向量std::vector <unsigned char>中。现在,我需要将此图像作为背景应用于WinAPI窗口,我不知道如何将其转换为HBITMAP。也许有人之前做过,或者我可以使用其他格式或变量类型

1 个答案:

答案 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;
}