我有一個類似的問題,How to display text in system tray icon with win32 API?如何使用Win32 API的C++顯示系統托盤圖標的文字 - 第2部分
我想他的解決方案,但它不是爲我工作。我得到一個小的4x16白色圖像作爲系統圖標而不是文本,我不明白爲什麼。
我不使用MFC/.NET只是win32 api。
void UpdateIcon(HWND hWnd){
NOTIFYICONDATA nid;
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = 100;
nid.hIcon = CreateSmallIcon(hWnd);
nid.uFlags = NIF_ICON;
Shell_NotifyIcon(NIM_MODIFY, &nid);
}
HICON CreateSmallIcon(HWND hWnd)
{
static TCHAR *szText = TEXT ("100");
HDC hdc, hdcMem;
HBITMAP hBitmap = NULL;
HBITMAP hOldBitMap = NULL;
HBITMAP hBitmapMask = NULL;
ICONINFO iconInfo;
HFONT hFont;
HICON hIcon;
hdc = GetDC (hWnd);
hdcMem = CreateCompatibleDC (hdc);
hBitmap = CreateCompatibleBitmap (hdc, 16, 16);
hBitmapMask = CreateCompatibleBitmap (hdc, 16, 16);
ReleaseDC (hWnd, hdc);
hOldBitMap = (HBITMAP) SelectObject (hdcMem, hBitmap);
PatBlt (hdcMem, 0, 0, 16, 16, WHITENESS);
// Draw percentage
hFont = CreateFont (12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
TEXT ("Arial"));
hFont = (HFONT) SelectObject (hdcMem, hFont);
TextOut (hdcMem, 0, 0, szText, lstrlen (szText));
SelectObject (hdc, hOldBitMap);
hOldBitMap = NULL;
iconInfo.fIcon = TRUE;
iconInfo.xHotspot = 0;
iconInfo.yHotspot = 0;
iconInfo.hbmMask = hBitmapMask;
iconInfo.hbmColor = hBitmap;
hIcon = CreateIconIndirect (&iconInfo);
DeleteObject (SelectObject (hdcMem, hFont));
DeleteDC (hdcMem);
DeleteDC (hdc);
DeleteObject (hBitmap);
DeleteObject (hBitmapMask);
return hIcon;
}
也許調用DuplicateIcon(NULL,hIcon),銷燬hIcon,然後返回重複的圖標。沒有嘗試過,但可能值得一試。 – pezcode
我寧願推薦 - 因爲它被提及 - 只是存儲somwhere那些位圖和掩碼,直到新圖標被創建。 –