Das TNA-Icon erzeugen


Um ein Symbol in der TNA ablegen zu können, brauchen wir zuerst das TNotifyIconData-Record. Nachdem wir die Unit "ShellAPI.pas" eingebunden haben, können wir die meisten Variablen bereits während der Initialisierung füllen:

var
  NID : TNotifyIconData = (
    cbSize           : sizeof(TNotifyIconData);
    uID              : 1052002;
    uFlags           : NIF_MESSAGE or NIF_ICON or NIF_TIP;
    uCallbackMessage : WM_TNAMSG;
    hIcon            : 0;
    szTip            : szClassname;
  );

Ich habe im Beispiel als Wert für uID das Datum gewählt. Sie können nach diesem Prinzip vorgehen und jedem Ihrer TNA-Programme eine eindeutige ID zuordnen. Sie können ebenso aber auch den Wert Null benutzen. Wichtig ist, dass Sie für jedes TNA-Symbol, das Ihr Programm verwendet, eine eigene ID benutzen, da dies sozusagen der Kanal ist, auf dem das Betriebssystem und Ihr Programm die einzelnen Symbole ansprechen. Die Variable uCallbackMessage besitzt eine Nachricht namens "WM_TNAMSG" als Wert. Diese Nachricht existiert nicht im System, sie vom Programm definiert:

const
  WM_TNAMSG  = WM_USER + 10;

Außerdem sei noch ein Wort zu den Flags gestattet:

Wert Bedeutung
NIF_MESSAGE wir wollen Nachrichten bearbeiten, also muss uCallbackMessage eine gültige Variable bezeichnen
NIF_ICON wir wollen ein Icon sehen, also muss ein hIcon gültiges Symbol-Handle sein
NIF_TIP ein Tooltipp soll zu sehen sein


Es fehlen noch zwei Dinge, damit unser Kontakt zustande kommt: wir müssen das Fenster-Handle und ein Symbol festlegen. Da wir das Handle zum Zeitpunkt der Variablen-Initialisierung nicht kennen (können), weisen wir es während der Erzeugung zu:

WM_CREATE:
  begin
    NID.wnd   := wnd; // Fenster-Handle
    NID.hIcon := LoadIcon(0,IDI_INFORMATION); // Icon laden
Shell_NotifyIcon(NIM_ADD,@NID); // Icon anzeigen end;

In der letzten Zeile sehen Sie auch gleich den Befehl Shell_NotifyIcon, der den Kontakt unseres Programms zur "Taskbar Notification Area" herstellen, aber auch lösen kann. Folgende Aktionen sind möglich:

Wert Bedeutung
NIM_ADD das Symbol wird hinzugefügt
NIM_DELETE das Symbol wird entfernt
NIM_MODIFY das Symbol wird geändert (das gilt auch für den Tooltipp)

Bevor Sie das Programm also testen, sollten Sie dafür sorgen, dass das Symbol beim Beenden wieder entfernt wird. Wenn Sie das vergessen, dann entfernt das System das Symbol, sobald Sie mit dem Mauszeiger drauf kommen. Aber es sieht unschön aus, also sollten Sie daran denken:

WM_DESTROY:
  begin
    Shell_NotifyIcon(NIM_DELETE,@NID); // Icon entfernen
    PostQuitMessage(0);
  end;