2011-09-18 1 views
1

- 파트 I이 유사한 질문이 2

How to display text in system tray icon with win32 API? 나는 그의 해결책을 시도했지만 나를 위해 작동하지 않습니다. 텍스트 대신 시스템 아이콘으로 4x16 크기의 작은 흰색 이미지를 얻었습니다. 이유를 이해할 수 없습니다.

MFC/.NET을 사용하지 않고 win32 API 만 사용하고 있습니다.

void UpdateIcon(HWND hWnd){ 
    NOTIFYICONDATA nid; 
    nid.cbSize = sizeof(NOTIFYICONDATA); 
    nid.hWnd = hWnd; 
    nid.uID = 100; 
    nid.hIcon = CreateSmallIcon(hWnd); 
    nid.uFlags = NIF_ICON; 
    Shell_NotifyIcon(NIM_MODIFY, &nid); 
} 

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; 
} 

답변

1

나는 창문이 잘 작동하는지 그래서 내가 확인할 수 없습니다 현재 설치하지 않은,하지만 난 잠재적 인 문제를 발견 - CreateIconIndirect function의 MSDN 문서에서 :

응용 프로그램은을 계속 관리해야한다 원래 비트 맵을 삭제하고 더 이상 필요하지 않을 때 삭제하십시오.

너무 빨리 비트 맵을 삭제하는 것처럼 보입니다.

+0

아마도 DuplicateIcon (NULL, hIcon)을 호출하고, hIcon을 삭제 한 다음 복제 된 아이콘을 반환 할 수 있습니다. 그것을 시도하지는 않았지만, 가치가있을 수 있습니다. – pezcode

+0

내가 언급 한 바대로, 비트 맵을 숨기고 새로운 아이콘이 만들어 질 때까지 마스크를 저장하십시오. –

0

당신은 아마도 전경 색상을 배경을 설정해야합니다

SetTextColor(hdcMem, 0x00FF0000); // 0x00bbggrr, not rrggbb !! 
SetBkMode(hdcMem, TRANSPARENT); // VERY IMPORTANT 

난 당신이 GetDC()을 사용 DeleteDC (hdc); 여기에 필요하지 않습니다 생각합니다.

+0

'ReleaseDC'가 대신 사용되어야하므로 'DeleteDC'가 필요하지 않습니다. –

+0

'ReleasedDC'는 실제로'hdc' ('GetDC'에 의해 제공됨)에서 @ stack356의 스 니펫에 사용됩니다. 'hdcMem' ('CreateCompatibleDC'에 의해 제공됨)은'DeleteDC'되어 있습니다. 유일한 문제는 불필요한'DeleteDC (hdc)'입니다. – foudfou