Вращение растрового изображения с использованием GDI +, а затем преобразование в HDC - PullRequest
0 голосов
/ 23 сентября 2018

Я пытаюсь сделать то, что написано в заголовке.

Ниже приведен код, который должен возвращать HDC с повернутым значком.Я не уверен, почему он ничего не возвращает.Когда я пытаюсь нарисовать возвращенный HDC, ничего не появляется, и это не является ошибкой в ​​моем чертеже, я протестировал его.

Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR           gdiplusToken;

GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

Gdiplus::Bitmap SrcBitmap(L"H:\\Company\\iOG\\blue_arrow.tif", FALSE);

Gdiplus::Graphics DstGraphics(&SrcBitmap);

Gdiplus::REAL angle = lAngle;
DstGraphics.ResetTransform();
DstGraphics.RotateTransform(angle);
DstGraphics.TranslateTransform(SrcBitmap.GetWidth() / 2.0f, SrcBitmap.GetHeight() / 2.0f, Gdiplus::MatrixOrderAppend);
DstGraphics.DrawImage(&SrcBitmap, -((INT)SrcBitmap.GetWidth() / 2), -((INT)SrcBitmap.GetHeight() / 2), SrcBitmap.GetWidth(), SrcBitmap.GetHeight());

HBITMAP hBmp;
SrcBitmap.GetHBITMAP(Gdiplus::Color::Transparent, &hBmp);
HDC dcIcon = CreateCompatibleDC(NULL);
SelectObject(dcIcon, hBmp);

return dcIcon;

1 Ответ

0 голосов
/ 23 сентября 2018

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);, должен быть возвращен старый дескриптор растрового изображения,Старая ручка должна быть восстановлена ​​в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...