A tray icon elkészítéséhez szükségünk van a ShellAPI unit-ra.
Az ikon létrehozásához, szükségünk van egy TNotifyIconData típusú struktúrára. Ennek a struktúrának a tagjain keresztül állíthatjuk be az óra mellett megjelenő ikon képét, valamint az ikon tulajdonságait és viselkedését.
A TNotifyIconData struktúra a következő tagokkal rendelkezik:
- cbSize: DWORD – A struktúra mérete bájtokban.
- Wnd: HWND – A Form azonosítója, amely az ikont birtokolja.
- uID: UINT – Azonosító.
- uFlags: UINT – Flag-ek. Ezek határozzák meg, hogy a struktúra mely tagjai tartalmaznak valós értéket. A következő 3 érték kombinációit használhatjuk: NIF_ICON, NIF_TIP, NIF_MESSAGE.
- uCallbackMessage: UINT – Callback függvény, események generálására.
- hIcon: HICON – Az ikon azonosítója.
- szTip: array [0..63] of AnsiChar – Az itt megadott szöveg jelenik meg, ha az egeret az ikon fölött hagyjuk.
Az osztályból egy példányt a Form private deklarációjában hozunk létre.
FTrayIcon: TNotifyIconData;
A Form Create eseményében a struktúra tagjait beállítjuk.
with FTrayIcon do begin
cbSize:=SizeOf(FTrayIcon);
Wnd:=Self.Handle;
uID:=0;
uFlags:=NIF_ICON or NIF_TIP or NIF_MESSAGE;
uCallbackMessage:=WM_MOUSEMOVE;
hIcon:=Application.Icon.Handle;
szTip:='Delphi tray icon';
end;
A uCallbackMessage tagban, mindig a WM_MOUSEMOVE eseményt kell megadnunk.
Az ikon képe a példában az alkalmazás ikonja, de természetesen ezt bármi másra lecserélhetjük.
Az ikonon keletkező egéreseményeket a Form OnMouseMove eseményében kezelhetjük le.
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
Ez esetben a Shift és az Y paramétereket figyelmen kívül kell hagynunk.
Az X paraméterben kapjuk meg a létrejött egéresemény azonosítóját.
Az alábbi egéreseményeket használhatjuk (az események konstansai a Messages unit-ban vannak deklarálva):
| Esemény |
Jelentése |
| WM_LBUTTONDOWN |
A bal egérgomb lenyomása. |
| WM_LBUTTONUP |
Kattintás az egér bal gombjával. |
| WM_LBUTTONDBLCLK |
Dupla kattintás az egér bal gombjával. |
| WM_RBUTTONDOWN |
A jobb oldali egérgomb lenyomása. |
| WM_RBUTTONUP |
Kattintás az egér jobb oldali gombjával. |
| WM_RBUTTONDBLCLK |
Dupla kattintás az egér jobb oldali gombjával. |
Az ikont akkor hozzuk létre az óra mellett, amikor alkalmazásunkat minimalizáljuk. A minimalizáláshoz saját kezelőfüggvényt kell írnunk, melyet hozzárendelünk az alkalmazás OnMinimize eseményéhez.
Application.OnMinimize:=DoMinimize;
A DoMinimize metódusban két dolgot kell megtennünk.
procedure TForm1.DoMinimize(Sender: TObject);
begin
Shell_notifyIcon(NIM_ADD,@FTrayIcon);
Hide;
end;
A Shell_notifyIcon függvény meghívásával elhelyezzük az ikont az óra mellett, a Hide metódus meghívásával pedig elrejtjük a Form-ot.
A Form OnMouseMove eseményében az egér bal gombjának kattintásakor a Form-ot visszaállítjuk eredeti állapotába. Ehhez az alábbi utasításokra van szükségünk.
Show;
Application.BringToFront;
Application.Restore;
Shell_notifyIcon(NIM_DELETE,@FTrayIcon);
A Show megjeleníti az elrejtett Form-ot, a BringToFront utasítás a képernyőn a többi ablak elé helyezi azt. A Restore parancs meghívására azért van szükség, hogy az operációs rendszer ezután ne minimalizált ablakként kezelje a Form-ot.
Az ikon megszüntetésére is a Shell_notifyIcon függvényt használhatjuk, azonban ezúttal a NIM_DELETE paraméterrel. A létrehozott ikon megszüntetéséről mindig nekünk kell gondoskodnunk. Egy alkalmazáshoz több ilyen ikon is tartozhat.
Ha az ikonhoz menüt is akarunk rendelni, akkor a Form-on el kell helyeznünk egy TPopupMenu komponenst. A menüpontok funkcióit ugyanúgy kell beállítanunk, mint más esetekben.
A menü meghívásáról a Form OnMouseMove eseményében gondoskodhatunk. Ezt az egér jobb oldali gombjának megnyomásakor tesszük.
Mouse:=TMouse.Create;
PopupMenu1.Popup(Mouse.CursorPos.x,Mouse.CursorPos.y);
Mouse.Free;
Mivel nem tudjuk, hogy a menünek hol kell megjelennie, le kell kérdeznünk az egér aktuális pozícióját a képernyőn. Ezt könnyedén megtehetjük, ha a TMouse osztályból létrehozunk egy példányt, és felhasználjuk a CursorPos property-jét.