HomepageSoftware,
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
>> ]
|