2009-01-19 11 views
7

Intentando crear una aplicación de monitor pequeña que muestre el uso actual de internet como porcentaje en la bandeja del sistema en C usando la API win32.¿Cómo mostrar el texto en el icono de la bandeja del sistema con la API de win32?

También desea utilizar el fondo de color o el texto en color en función de cuánto se usa en relación con los días que quedan en el mes.

EDITAR: Para aclarar, quiero que el icono de la bandeja del sistema sea dinámico. A medida que el porcentaje cambia, actualizo el icono de la bandeja del sistema. En busca de una solución que utiliza simplemente viejo win32 (es decir, sin MFC o WTL).

+0

Consulte también: http://support.microsoft.com/kb/318876 – Paul

Respuesta

6

Bueno aquí está mi solución 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

¿Qué pasa con el voto a favor? – grom

0

¿El texto se refiere a "Consejos"?

Asumiendo que tienen su icono en la bandeja

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

No No descripción. Quiero que el icono sea un número. – grom

1

El sistema de bandeja del sistema sólo acepta iconos para mostrar, no el texto.

Para obtener un texto que se muestra allí, primero debe crear un mapa de bits de memoria, dibujar su texto en él, luego convertir ese mapa de bits de memoria a un icono de memoria y hacer que la bandeja del sistema muestre ese icono.

código de ejemplo a continuación:

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

Ahora, si solo pudiera obtener esto usando simplemente win32 en lugar de MFC – grom

+0

, no debería ser un problema: reemplace "CDC dcMem" por "HDC hdcMem" y luego use la API en lugar de los métodos. Las API tienen el mismo nombre que los métodos de MFC, p. dcMem.CreateCompatibleDC() => :: CreateCompatibleDC (hdcMem, NULL); – Stefan

Cuestiones relacionadas