2009-01-19 39 views
7

Cố gắng tạo một ứng dụng màn hình nhỏ hiển thị mức sử dụng Internet hiện tại dưới dạng phần trăm trong khay hệ thống trong C bằng cách sử dụng API win32.Làm thế nào để hiển thị văn bản trong biểu tượng khay hệ thống với API win32?

Cũng muốn sử dụng màu nền hoặc văn bản màu dựa trên số lượng được sử dụng tương đối so với các ngày còn lại trong tháng.

EDIT: Để làm rõ tôi muốn biểu tượng khay hệ thống động. Khi phần trăm thay đổi, tôi cập nhật biểu tượng khay hệ thống. Tìm kiếm giải pháp chỉ sử dụng win32 cũ (ví dụ: Không MFC hoặc WTL).

+0

Xem thêm: http://support.microsoft.com/kb/318876 – Paul

Trả lời

6

Được rồi đây là giải pháp của tôi 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

những gì với downvote? – grom

0

Bằng văn bản bạn có nghĩa là "Mẹo"?

Giả sử bạn có biểu tượng của bạn trên khay hệ thống

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

Không không tooltip. Tôi muốn biểu tượng là một con số. – grom

1

Các khay hệ thống chỉ chấp nhận các biểu tượng để hiển thị, không phải văn bản.

Để có văn bản được hiển thị ở đó, trước tiên bạn phải tạo bitmap bộ nhớ, vẽ văn bản trên đó, sau đó chuyển đổi bitmap bộ nhớ đó thành biểu tượng bộ nhớ và khay hệ thống hiển thị biểu tượng đó.

Ví dụ mã bên dưới:

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

Bây giờ nếu chỉ tôi có thể nhận được điều này bằng cách sử dụng chỉ cần đồng bằng win32 thay vì MFC – grom

+0

không phải là một vấn đề: thay thế "CDC dcMem" với "HDC hdcMem" và sau đó sử dụng API thay vì các phương pháp. API có cùng tên với các phương thức MFC, ví dụ: dcMem.CreateCompatibleDC() => :: CreateCompatibleDC (hdcMem, NULL); – Stefan

Các vấn đề liên quan