2009-01-19 6 views
7

Der Versuch, eine kleine Monitor-Anwendung zu erstellen, die aktuelle Internetnutzung als Prozentsatz in der Taskleiste in C mit Win32-API anzeigt.Wie zeigt man Text in der Taskleiste mit win32 API an?

Auch verwenden möchten, Farbhintergrund oder Farbe Text basierend auf wie viel im Vergleich zu Tagen im Monat verwendet wird.

EDIT: Um zu klären, ich möchte das System Tray-Symbol dynamisch sein. Wenn sich der Prozentsatz ändert, aktualisiere ich das Taskleistensymbol. Auf der Suche nach einer Lösung, die einfach nur alte Win32 verwendet (dh. Keine MFC oder WTL).

+0

Siehe auch: http://support.microsoft.com/kb/318876 – Paul

Antwort

6

Okay, hier ist meine win32 Lösung:

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

Was ist mit dem Downvote? – grom

0

Mit dem Text meinen Sie "Tipps"?

Sie Unter der Annahme, dass Ihr Symbol auf der Taskleiste

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

Nein nicht Tooltip. Ich möchte, dass das Symbol eine Nummer ist. – grom

1

Die Taskleiste nur Symbole zeigen akzeptiert, nicht Text.

Um einen Text dort angezeigt zu bekommen, müssen Sie zunächst ein Speicher-Bitmap erstellen, Ihren Text darauf zeichnen, dann dieses Speicher-Bitmap in ein Speichersymbol konvertieren und in der Taskleiste dieses Symbol anzeigen lassen.

Beispiel-Code unten:

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

Nun, wenn ich nur mit Win32 anstelle von MFC – grom

+0

das Problem bekommen könnte, sollte kein Problem sein: Ersetzen Sie "CDC dcMem" durch "HDC hdcMem" und verwenden Sie dann die APIs anstelle der Methoden. Die APIs haben denselben Namen wie die MFC-Methoden, z. dcMem.CreateCompatibleDC() => :: CreateCompatibleDC (hdcMem, NULL); – Stefan

Verwandte Themen