SitemapInfoHomeTips und Tricks - Zur Laufzeit Symbole erzeugen

Homepage

Software,
Download

Software-
entwicklung

  Tips und Tricks

Nachrichten-
technik

Internet

Aktuelles,
Sonstiges

Infos,
Kontakt

Sitemap


Mit der folgenden Funktion wird zur Laufzeit ein Symbol (Icon) erzeugt welches ein beliebiges Textzeichen darstellt. Eine leicht geänderte Variante dieser Funktion kann z.B. zur Erzeugung von Benachrichtigungssymbolen für die Systemablage (Prozessortemperatur, Batterieladestatus, usw.) verwendet werden.


#include "windows.h"
#include "tchar.h"

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
   // Wird eigentlich nur für CreateCompatibleBitmap benötigt
   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.
   // Statt hdcMemColor könnte man auch hdcScreen (s.o.) oder NULL übergeben.
   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;
}

[ dynicon.cpp ]

[ << Vorheriger ] [ Übersicht ] [ Nächster >> ]

TopHomepage » Softwareentwicklung » Tips und Tricks » Symbole (Icons)