[Windows / C ++-将图标呈现为具有透明性的位图

问题描述 投票:0回答:1

我不是任何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(透明)*使用主题代码获取菜单颜色...

如何制作具有透明度的适当位图?

c++ windows bitmap icons gdi
1个回答
0
投票

最终,答案是我没有做错任何事情。此菜单是使用IContextMenu在shell插件中构造的菜单的一部分。

答案-实现IContextMenu2。然后,执行所有者绘制菜单项。

© www.soinside.com 2019 - 2024. All rights reserved.