Celý dnešní díl bude zaměřen na jedno téma a tím je minimalizování aplikace na hlavní panel vedle hodin, tedy zobrazení příslušné ikony na tomto místě včetně zobrazení kontextového menu po stisku pravého tlačítka myši.
Ikona aplikace v hlavním panelu - tray icon
Jistě dobře víte, že řada aplikací se po svém spuštění "usídlí" v hlavním panelu vedle hodin v podobě malé ikonky. Obvykle se jedná o aplikace, které běží již od startu systému a vykonávají na pozadí nějaké funkce (antivirový program či různé další utility). Nevyžadují žádnou zvláštní pozornost uživatele a jejich hlavní okno by se tedy na ploše jen zbytečně pletlo. Zároveň však musí být jejich funkce občas přístupné a nebo je alespoň třeba indikovat, že daná aplikace běží. K tomu se právě ideálně hodí místo vedle hodin na hlavním panelu –
tray. Tolik tedy teorie, ale praxe je bohužel trochu jiná, což sami jistě velmi dobře víte. Ikonu se na toto místo snaží "nacpat" kdejaká aplikace, takže někdy jich tam má uživatel slušnou řádku. Proto mi dovolte, ještě než si ukážeme jak touto ikonkou naše aplikace opatřit, jedno malé doporučení: dávat ikonu do hlavního panelu jen tehdy, když to má smysl (a ne proto, abyste ukázali, že to umíte). Také je dobré, aby o zobrazení či nezobrazení ikony mohl rozhodnout uživatel v nastavení programu.
Dost ale zbytečných a nudných úvodů a pojďme k našemu příkladu. Po jeho spuštění bude aplikace ihned minimalizována, nebude vidět na hlavním panelu vedle tlačítka Start a zároveň se vedle hodin zobrazí příslušná ikonka. Po kliknutí na ni levým tlačítkem myši bude aplikace opět maximalizována (či přesněji řečeno, bude obnoveno hlavní okno do původního stavu), po kliknutí pravým tlačítkem se zobrazí kontextové menu.
Ještě je třeba upozornit, že budeme potřebovat knihovnu ShellAPI, takže ji nezapomeňte přidat do projektu. Vytvořte tedy nový projekt, přidejte zmíněnou knihovnu a také přidejte PopupMenu, v němž si můžete nadefinovat zcela libovolné položky (slouží pouze pro demonstraci).
Dále následuje část deklarace:
.
.
.
procedure FormCreate(Sender: TObject);
procedure WndProc(var Message: TMessage); override;
procedure Showform1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
IconNotifyData : TNotifyIconData;
end;
.
.
.
Procedura WndProc "odchytává" pokus o minimalizaci aplikace a zařídí její minimalizaci do ikony hlavního panelu. Zároveň se stará o reakce na kliknutí myší na ikonu – buď aplikaci obnoví nebo zobrazí PopupMenu.
procedure TForm1.WndProc(var Message: TMessage);
var
p : TPoint;
begin
case Message.Msg of
WM_SYSCOMMAND:
case Message.WParam and $FFF0 of
SC_MINIMIZE:
begin
Hide;
Exit;
end;
SC_RESTORE: ;
end;
WM_USER + 1:
case Message.lParam of
WM_RBUTTONDOWN:
begin
GetCursorPos(p);
PopupMenu1.Popup(p.x, p.y);
end;
WM_LBUTTONDOWN:
begin
Show;
end;
end;
end;
inherited ;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
with IconNotifyData do
begin
hIcon := Application.Icon.Handle;
uCallbackMessage := WM_USER + 1;
cbSize := sizeof(IconNotifyData);
Wnd := Handle;
uID := 100;
uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
end;
StrPCopy(IconNotifyData.szTip, Application.Title);
Shell_NotifyIcon(NIM_ADD, @IconNotifyData);
Application.ShowMainForm := False;
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
end;
procedure TForm1.Showform1Click(Sender: TObject);
begin
Show;
SetForegroundWindow(Self.handle);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE, @IconNotifyData);
end;
Jako text bublinkové nápovědy u ikony je použit titulek aplikace – viz řádek StrPCopy(IconNotifyData... v události OnCreate hlavního formuláře, ale můžete jej pochopitelně libovolně měnit.
Jak vidíte, přidat si ikonku na hlavní panel není složité ani pracné. I když je tento příklad velmi jednoduchý a má sloužit spíše jako ukázka, základní funkce plní. Přidat některá další vylepšení však není problém. Pokud tedy místo použití hotových komponent dáváte přednost vlastní tvorbě, račte experimentovat.