How to display text in system tray icon with win32 API?

后端 未结 3 1031
萌比男神i
萌比男神i 2021-02-06 02:26

Trying to create a small monitor application that displays current internet usage as percentage in system tray in C using win32 API.

Also wanting to use colour backgrou

相关标签:
3条回答
  • 2021-02-06 03:14

    The system tray only accepts icons to show, not text.

    To get a text shown there, you have to first create a memory bitmap, draw your text on it, then convert that memory bitmap to a memory icon and have the system tray show that icon.

    Example code below:

    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 );  
    
    0 讨论(0)
  • 2021-02-06 03:17

    Okay here is my win32 solution:

    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;
    }
    
    0 讨论(0)
  • 2021-02-06 03:20

    By text you mean "Tips" ?

    Assuming you have your icon on the System Tray

    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);
    
    0 讨论(0)
提交回复
热议问题