Windows / C ++ - рендеринг иконки в растровое изображение с прозрачностью - PullRequest
0 голосов
/ 20 февраля 2019

Я не эксперт ни в чем GDI.Но мне дали код ГОДА назад, который хорошо послужил мне.Но он стареет ... и с новой темной темой windows10 показывает свои недостатки.

Я рендеринг меню (в плагине меню проводника).Вот фрагмент кода, используемый для создания растрового изображения.

Моя цель - преобразовать этот код для создания растрового изображения с сохранением прозрачности значка.

(результат HBITMAP заканчивается в pItem-> m_hBitmap)

HICON hIcon;
if ( (iIndex >= 0) && (ExtractIconEx(iconDLLPath, iIndex, NULL, &hIcon, 1) != 0) )
{
    HDC hdc = CreateIC(L"DISPLAY", NULL, NULL, NULL);
    HDC hdcMem = CreateCompatibleDC(hdc);

    // XP demands 12x12, otherwise use 16x16
    int cx = GetSystemMetrics((m_bUseSmallerIcons) ? SM_CXMENUCHECK : SM_CXSMICON);
    int cy = GetSystemMetrics((m_bUseSmallerIcons) ? SM_CYMENUCHECK : SM_CYSMICON);
    pItem->m_hBitmap = CreateCompatibleBitmap(hdc, cx, cy);
    HBITMAP hBmOld = (HBITMAP) SelectObject(hdcMem, pItem->m_hBitmap);

    // DC:  paint entire mem dc COLOR_MENU so icon looks transparent
    // when painted into context menu having this background color
    HBRUSH hBrush = CreateSolidBrush(GetSysColor(COLOR_MENU));
    RECT rect;
    rect.left = 0;
    rect.top = 0;
    rect.right = cx;
    rect.bottom = cy;
    FillRect(hdcMem, &rect, hBrush);
    DeleteObject(hBrush);

    // Draw icon transparently, on top of the background color.  Transparent
    // areas will be the background color.
    DrawIconEx(hdcMem, 0, 0, hIcon, cx, cy, 0, 0, DI_NORMAL);

    // Cleanup
    SelectObject(hdcMem, hBmOld);
    DeleteDC(hdc);
    DeleteDC(hdcMem);

    DestroyIcon(hIcon);
}

Я должен удалить тот, который рисует белый фон, но как мне положить прозрачный фон?Все, что я пробовал, дает черный фон.
* просто удаляем белую "заливку" * SetBkMode (TRANSPARENT) * используя код темы, чтобы получить цвет меню ...

Как мне поступитьсделать правильное растровое изображение с прозрачностью?

...