2009-01-19 50 views
7

試圖創建顯示當前互聯網的使用如在使用Win32 API的在空調系統托盤百分比小的顯示器應用。如何使用win32 API顯示系統托盤圖標中的文本?

也想用彩色背景或彩色文本基於多少相對於留在一個月的幾天內使用。

編輯:澄清我希望系統托盤圖標是動態的。隨着百分比變化,我更新系統托盤圖標。尋找只使用普通的舊式win32(即沒有MFC或WTL)的解決方案。

+0

參見:http://support.microsoft.com/kb/318876 – Paul 2014-09-06 12:38:12

回答

6

好吧,這裏是我的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; 
} 
0

根據文本你的意思「提示」?

假設你有你的圖標在系統托盤

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

無不是提示。我想讓這個圖標成爲一個數字。 – grom 2009-01-19 10:32:28

1

系統托盤只接受圖標顯示,而不是文字。

到那裏顯示文本,你必須首先創建一個內存位圖,畫上的文字,那麼內存位圖轉換爲內存圖標,並有系統托盤顯示,圖標。

如下代碼示例:

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

現在,如果只有我能使用只是普通的Win32而不是MFC – grom 2009-01-19 11:11:34

+0

不應該是一個問題,得到這樣的:有「HDC hdcMem」替換「CDC dcMem」,然後使用API​​的替代方法。這些API與MFC方法具有相同的名稱,例如, dcMem.CreateCompatibleDC()=> :: CreateCompatibleDC(hdcMem,NULL); – Stefan 2009-01-19 11:21:18