2016-02-18 14 views
1

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

+2

Помогает ли это? http://stackoverflow.com/q/4598872/3747990 – Niall

ответ

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... 

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; 
} 
+0

Есть ли способ установить размер изображения так же, как и окно? – ali

+1

Вы можете установить кисть фона в ноль, а затем нарисовать в 'WM_PAINT', см. Edit. Если вам действительно нужна фоновая кисть, вам нужно изменить размер изображения в WM_SIZE, использовать память dc для изменения размера изображения и т. Д., Чтобы создать новый 'HBITMAP' –