以编程方式更改任务栏图标(Win32,C ++)

时间:2013-05-09 22:58:30

标签: c++ winapi

我有一个C ++ win32程序,我想在运行时编辑任务栏图标以显示有关该程序的警报等,但是我对win32 api不太熟悉,而且我还没有能力在网上找到任何东西。我发现的最接近的是http://www.windows-tech.info/17/52a5bfc45dac0ade.php,它告诉我如何在运行时从光盘上加载图标并进行更改。

我想在这个问题中做他们做的事情:Create an icon in memory with win32 in python但是在C ++中没有外部库

1 个答案:

答案 0 :(得分:5)

  

我想在这个问题中做他们做的事情:Create an icon in memory with win32 in python但是在C ++中没有外部库

由于接受的答案使用的是wxWidgets库,它只是Win32 API的一个包装器,因此该解决方案的转换效果非常好。

您需要做的就是使用CreateCompatibleBitmap函数在内存中创建位图。然后,您可以使用标准GDI绘图函数绘制到该位图。最后,使用CreateIconIndirect函数创建图标。

最难的部分是跟踪您的资源并确保在完成后释放所有资源以防止内存泄漏。如果它全部包含在一个使用RAII来确保对象被正确释放的库中,那就更好了,但如果你用C ++编写C代码,它将如下所示:

HICON CreateSolidColorIcon(COLORREF iconColor, int width, int height)
{
    // Obtain a handle to the screen device context.
    HDC hdcScreen = GetDC(NULL);

    // Create a memory device context, which we will draw into.
    HDC hdcMem = CreateCompatibleDC(hdcScreen);

    // Create the bitmap, and select it into the device context for drawing.
    HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen, width, height);    
    HBITMAP hbmpOld = (HBITMAP)SelectObject(hdcMem, hbmp);

    // Draw your icon.
    // 
    // For this simple example, we're just drawing a solid color rectangle
    // in the specified color with the specified dimensions.
    HPEN hpen        = CreatePen(PS_SOLID, 1, iconColor);
    HPEN hpenOld     = (HPEN)SelectObject(hdcMem, hpen);
    HBRUSH hbrush    = CreateSolidBrush(iconColor);
    HBRUSH hbrushOld = (HBRUSH)SelectObject(hdcMem, hbrush);
    Rectangle(hdcMem, 0, 0, width, height);
    SelectObject(hdcMem, hbrushOld);
    SelectObject(hdcMem, hpenOld);
    DeleteObject(hbrush);
    DeleteObject(hpen);

    // Create an icon from the bitmap.
    // 
    // Icons require masks to indicate transparent and opaque areas. Since this
    // simple example has no transparent areas, we use a fully opaque mask.
    HBITMAP hbmpMask = CreateCompatibleBitmap(hdcScreen, width, height);
    ICONINFO ii;
    ii.fIcon = TRUE;
    ii.hbmMask = hbmpMask;
    ii.hbmColor = hbmp;
    HICON hIcon = CreateIconIndirect(&ii);
    DeleteObject(hbmpMask);

    // Clean-up.
    SelectObject(hdcMem, hbmpOld);
    DeleteObject(hbmp);
    DeleteDC(hdcMem);
    ReleaseDC(NULL, hdcScreen);

    // Return the icon.
    return hIcon;
}

添加错误检查和代码以在位图上绘制一些有趣的东西留给读者练习。

正如我在上面的评论中所说,一旦您创建了图标,您可以通过发送WM_SETICON message并将HICON作为LPARAM传递来设置窗口的图标:

SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);

您还可以指定ICON_SMALL以设置窗口的小图标。如果您只设置一个大图标,它将缩小以自动创建小图标。但是,如果仅设置小图标,则窗口将继续使用默认图标作为其大图标。大图标通常的尺寸为32x32,而小图标通常的尺寸为16x16。但是,这不是保证,所以不要硬编码这些值。如果您需要确定它们,请使用SM_CXICONSM_CYICON调用GetSystemMetrics函数以检索大图标的宽度和高度,或SM_CXSMICONSM_CYSMICON检索小图标的宽度和高度。

使用GDI在Windows中绘制相当好的教程here。如果这是你第一次这样做并且之前没有GDI经验,我建议你仔细阅读。