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;
}
아마도 DuplicateIcon (NULL, hIcon)을 호출하고, hIcon을 삭제 한 다음 복제 된 아이콘을 반환 할 수 있습니다. 그것을 시도하지는 않았지만, 가치가있을 수 있습니다. – pezcode
내가 언급 한 바대로, 비트 맵을 숨기고 새로운 아이콘이 만들어 질 때까지 마스크를 저장하십시오. –