2013-05-09 226 views
1

我有一個C++ win32程序,並且我想在運行時編輯任務欄圖標以顯示有關程序的警報等,但是我對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 – 2013-05-09 23:01:27

+0

您可能正在尋找圖標疊加層。 – chris 2013-05-09 23:02:58

+0

你的問題非常含糊。如果您正在討論Windows 7在任務欄中顯示圖標通知和進度信息,那麼您需要查找「ITaskBarList」,「ITaskBarList2」和「ITaskBarList3」shell界面,您可以在MSDN上找到有關該界面的信息。 – 2013-05-09 23:09:31

回答

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。但是,這並不是保證的,所以不要硬編碼這些值。如果需要確定它們,請撥打GetSystemMetrics函數SM_CXICONSM_CYICON以檢索大圖標的寬度和高度,或者SM_CXSMICONSM_CYSMICON以檢索小圖標的寬度和高度。

有關使用GDI在Windows中繪圖的相當好的教程可用here。如果這是您第一次執行此操作並且沒有GDI經驗,我建議您仔細閱讀。

相關問題