Gdiplus::Bitmap::GetHBITMAP
создает новый дескриптор растрового изображения.Этот дескриптор должен быть удален, когда он больше не нужен.Способ, описанный выше, настроен, дескриптор растрового изображения потерян и его невозможно очистить.Это приведет к утечке ресурсов, и программа в конечном итоге перестанет работать.
Вы должны следовать за дескриптором растрового изображения для измененного изображения, а не контекстом устройства, где отображается это растровое изображение.Вы можете изменить код следующим образом:
HBITMAP convert(const wchar_t* filename, UINT& w, UINT& h)
{
Gdiplus::Bitmap src(filename, FALSE);
if(0 != src.GetLastStatus())
return NULL;
w = src.GetWidth();
h = src.GetHeight();
Gdiplus::Graphics gr(&src);
gr.ResetTransform();
gr.RotateTransform(45);
gr.TranslateTransform(w / 2.0f, h / 2.0f, Gdiplus::MatrixOrderAppend);
gr.DrawImage(&src, -(INT)w / 2, -(INT)h / 2);// , w, h);
HBITMAP hbitmap = NULL;
src.GetHBITMAP(Gdiplus::Color::Transparent, &hbitmap);
return hbitmap;
}
void draw(HDC hdc)
{
UINT w, h;
HBITMAP hbitmap = convert(L"filename.bmp", w, h);
if(hbitmap)
{
HDC memdc = CreateCompatibleDC(hdc);
auto oldbmp = SelectObject(memdc, hbitmap);
BitBlt(hdc, 0, 0, w, h, memdc, 0, 0, SRCCOPY);
SelectObject(memdc, oldbmp);
DeleteDC(memdc);
DeleteObject(hbitmap);
}
}
Кроме того, вызов GdiplusStartup
должен заканчиваться на GdiplusShutdown
SelectObject(dcIcon, hBmp);
, должен быть возвращен старый дескриптор растрового изображения,Старая ручка должна быть восстановлена в конце.