2013-05-09 3 views
1

У меня есть программа Win32 для C++, и я хотел бы отредактировать значок панели задач во время выполнения, чтобы отображать предупреждения и т. Д. О программе, однако я не слишком опытен с win32 api, и я не смог найти что-либо в Интернете. Самый близкий я нашел http://www.windows-tech.info/17/52a5bfc45dac0ade.php, который рассказывает, как загрузить значок с диска во время выполнения и изменить его.Изменение значка панели задач программно (Win32, C++)

Я хотел бы сделать то, что они делают в этом вопросе: Create an icon in memory with win32 in python, но в C++ и без внешней библиотеки

+0

Возможный дубликат: http://stackoverflow.com/q/1014101 –

+0

Возможно, вы ищете иконки. – chris

+0

Ваш вопрос очень расплывчатый. Если вы говорите о показе уведомлений и информации о событиях, как Windows 7 на панели задач, вы ищете интерфейсы оболочки 'ITaskBarList',' ITaskBarList2' и 'ITaskBarList3', которые вы можете найти в MSDN. –

ответ

5

Я хотел бы сделать то, что они делают в этом вопросе: Create an icon in memory with win32 in python но в C++ и без него внешняя библиотека

Поскольку принятый ответ использует библиотеку wxWidgets, которая является просто оболочкой API Win32, решение прекрасно переводится.

Все, что вам нужно сделать, это создать растровое изображение в памяти с помощью функции 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. Это, однако, не гарантируется, поэтому не перекодируйте эти значения. Если вам нужно их определить, вызовите функцию GetSystemMetrics с помощью SM_CXICON и SM_CYICON, чтобы получить ширину и высоту больших значков, или SM_CXSMICON и SM_CYSMICON, чтобы получить ширину и высоту маленьких значков.

Доступно довольно хорошее руководство по рисованию в Windows с использованием GDI here. Я рекомендую внимательно прочитать его, если вы впервые делаете это и не имеете опыта работы с GDI.

Смежные вопросы