如何使用win32 API在系统托盘图标中显示文本?

尝试创建一个小型监视器应用程序,使用win32 API在C中的系统托盘中显示当前Internet使用率百分比。

还希望根据相对于月份剩余天数使用的颜色背景或颜色文本。

编辑:澄清我希望系统托盘图标是动态的。 随着百分比的变化,我更新了系统托盘图标。 寻找仅使用普通旧win32(即没有MFC或WTL)的解决方案。

好的,这是我的win32解决方案:

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; } 

系统托盘仅接受要显示的图标,而不接受文本。

要获得显示的文本,您必须首先创建一个内存位图,在其上绘制文本,然后将该内存位图转换为内存图标,并让系统托盘显示该图标。

示例代码如下:

 CDC dcMem; dcMem.CreateCompatibleDC(NULL); CBitmap* pOld = dcMem.SelectObject( &m_bmpIcon ); CBrush back( RGB(0,0,0) ); dcMem.FillRect( CRect(0,0,16,16), &back ); CBrush brush( COLORDOWN ); dcMem.FillRect( rcRecv, &brush ); dcMem.SelectObject( pOld ); HICON hIcon = CreateIconIndirect( &m_TaskBarIconInfo ); 

通过文字你的意思是“提示”?

假设您在系统托盘上有图标

 NOTIFYICONDATA _stNotifyIconData; // For a simple Tip _stNotifyIconData.uFlags = NIF_TIP; strcpy_s(_stNotifyIconData.szTip, "Little Tip"); // Copy Tip Shell_NotifyIcon(NIM_MODIFY, &_stNotifyIconData); // For a Ballon Tip _stNotifyIconData.uFlags = NIF_INFO; strcpy_s(_stNotifyIconData.szInfoTitle, "Title of the Ballon"); // Title strcpy_s(_stNotifyIconData.szInfo, "Text..." ); // Copy Tip _stNotifyIconData.uTimeout = 3000; // 3 Seconds _stNotifyIconData.dwInfoFlags = NIIF_INFO; Shell_NotifyIcon(NIM_MODIFY, &_stNotifyIconData);