// Name: CreateTrayIcon // Autor: Wolfgang Rolke // Erstellt: 11/2002 // Funktion: Erzeugt zur Laufzeit ein Benachrichtigungssymbol für die Systemablage #include "windows.h" #include "tchar.h" // AND XOR Anzeige // --------------- // 0 0 schwarz // 0 1 weiß // 1 0 transparent // 1 1 invertiert HICON CreateTrayIcon(LPCTSTR lpszText) { // Größe des Symboles bestimmen. Hier wird angenommen, daß es sich um // ein "system small icon" und nicht um ein "shell small icon" handelt. int cxIcon = GetSystemMetrics(SM_CXSMICON); int cyIcon = GetSystemMetrics(SM_CYSMICON); // Bezug zum Bildschirmgerätekontext anfordern HDC hdcScreen = GetDC(NULL); if (hdcScreen == NULL) return NULL; // Zum Bildschirm kompatiblen Speicherkontext für die XOR-Maske erzeugen // (1x1 Punkte S/W) HDC hdcMemColor = CreateCompatibleDC(hdcScreen); if (hdcMemColor == NULL) { ReleaseDC(NULL, hdcScreen); return NULL; } // Zum Bildschirm kompatiblen Speicherkontext für die AND-Maske erzeugen // (1x1 Punkte S/W) HDC hdcMemMask = CreateCompatibleDC(hdcMemColor); if (hdcMemMask == NULL) { DeleteDC(hdcMemColor); ReleaseDC(NULL, hdcScreen); return NULL; } // Symbolinformationsstruktur für CreateIconIndirect() füllen ICONINFO iconinfo; iconinfo.fIcon = TRUE; iconinfo.xHotspot = 0; iconinfo.yHotspot = 0; // Monochromes Rasterbild für die AND-Maske in der gewünschten Größe erzeugen iconinfo.hbmMask = CreateBitmap(cxIcon, cyIcon, 1, 1, NULL); if (iconinfo.hbmMask == NULL) { DeleteDC(hdcMemMask); DeleteDC(hdcMemColor); ReleaseDC(NULL, hdcScreen); return NULL; } // Zum Gerät kompatibles farbiges Rasterbild für die XOR-Maske in der // gewünschten Größe erzeugen iconinfo.hbmColor = CreateCompatibleBitmap(hdcScreen, cxIcon, cyIcon); if (iconinfo.hbmColor == NULL) { DeleteObject(iconinfo.hbmMask); DeleteDC(hdcMemMask); DeleteDC(hdcMemColor); ReleaseDC(NULL, hdcScreen); return NULL; } ReleaseDC(NULL, hdcScreen); // Das Rasterbild für die AND-Maske dem Speicherkontext zuweisen, // so das es manipuliert werden kann HBITMAP hbmMaskOld = (HBITMAP)SelectObject(hdcMemMask, iconinfo.hbmMask); // Gesamte Fläche der AND-Maske auf logisch 1 setzen (AND=1, XOR=0 -> transparent) PatBlt(hdcMemMask, 0, 0, cxIcon, cyIcon, WHITENESS); // Das Rasterbild für die XOR-Maske dem Speicherkontext zuweisen, // so das es manipuliert werden kann HBITMAP hbmColorOld = (HBITMAP)SelectObject(hdcMemColor, iconinfo.hbmColor); // Gesamte Fläche der XOR-Maske auf logisch 0 setzen (AND=1, XOR=0 -> transparent) PatBlt(hdcMemColor, 0, 0, cxIcon, cyIcon, BLACKNESS); // Schrift für den Symboltext erzeugen LOGFONT lf; memset((void *)&lf, 0, sizeof(lf)); lf.lfHeight = cyIcon; lf.lfWeight = FW_NORMAL; _tcscpy(lf.lfFaceName, TEXT("Arial")); HFONT hfontMaskOld = NULL; HFONT hfontColorOld = NULL; HFONT hfont = CreateFontIndirect(&lf); if (hfont != NULL) { // Schrift beiden Speicherkontexten zuweisen hfontMaskOld = (HFONT)SelectObject(hdcMemMask, hfont); hfontColorOld = (HFONT)SelectObject(hdcMemColor, hfont); } // Farbe für den Symboltext setzen COLORREF rgbOld = SetTextColor(hdcMemColor, GetSysColor(COLOR_BTNTEXT)); int nBkModeMaskOld = SetBkMode(hdcMemMask, TRANSPARENT); int nBkModeColorOld = SetBkMode(hdcMemColor, TRANSPARENT); RECT rc; rc.left = 0; rc.top = 0; rc.right = cxIcon; rc.bottom = cyIcon; // S/W-Text auf dem Rasterbild für die AND-Maske ausgeben (logisch 0) DrawText(hdcMemMask, lpszText, -1, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE); // Symboltext auf dem Rasterbild für die XOR-Maske ausgeben DrawText(hdcMemColor, lpszText, -1, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE); // Ursprünglichen Gerätekontext restaurieren SetBkMode(hdcMemMask, nBkModeMaskOld); SetBkMode(hdcMemColor, nBkModeColorOld); SetTextColor(hdcMemColor, rgbOld); if (hfontMaskOld != NULL) SelectObject(hdcMemMask, hfontMaskOld); if (hfontColorOld != NULL) SelectObject(hdcMemColor, hfontColorOld); if (hfont != NULL) DeleteObject(hfont); if (hbmMaskOld != NULL) SelectObject(hdcMemMask, hbmMaskOld); if (hbmColorOld != NULL) SelectObject(hdcMemColor, hbmColorOld); // Speicherkontexte löschen DeleteDC(hdcMemMask); DeleteDC(hdcMemColor); // Symbol erzeugen HICON hIcon = CreateIconIndirect(&iconinfo); // Rasterbilder löschen DeleteObject(iconinfo.hbmColor); DeleteObject(iconinfo.hbmMask); return hIcon; }