2009-01-19 19 views
7

Création d'une application de petit moniteur affichant l'utilisation actuelle d'Internet en tant que pourcentage dans la barre d'état système en C à l'aide de l'API win32.Comment afficher le texte dans l'icône de la barre d'état système avec l'API win32?

Vous souhaitez également utiliser l'arrière-plan de couleur ou le texte couleur en fonction de la quantité utilisée par rapport aux jours restants dans le mois.

EDIT: Pour clarifier, je souhaite que l'icône de la barre d'état système soit dynamique. Lorsque le pourcentage change, je mets à jour l'icône de la barre d'état système. Vous cherchez une solution qui utilise tout simplement vieux win32 (c'est-à-dire pas de MFC ou WTL).

+0

Voir aussi: http://support.microsoft.com/kb/318876 – Paul

Répondre

6

Bon voici ma solution 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; 
} 
+2

quoi de neuf avec le downvote? – grom

0

Par texte, vous voulez dire "Conseils"?

En supposant que vous avez votre icône sur la barre d'état

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); 
+1

Non pas infobulle. Je veux que l'icône soit un nombre. – grom

1

Le plateau de système accepte uniquement les icônes pour montrer, pas de texte.

Pour obtenir un texte affiché ici, vous devez d'abord créer un bitmap de mémoire, dessiner votre texte dessus, puis convertir ce bitmap de mémoire en icône de mémoire et faire afficher cette icône dans la barre d'état système.

code exemple ci-dessous:

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

Maintenant, si seulement je pouvais obtenir cela en utilisant simplement win32 au lieu de MFC – grom

+0

ne devrait pas être un problème: remplacer "CDC dcMem" par "HDC hdcMem", puis utiliser les API au lieu des méthodes. Les API ont le même nom que les méthodes MFC, par ex. dcMem.CreateCompatibleDC() => :: CreateCompatibleDC (hdcMem, NULL); – Stefan