Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 44. - Ikona aplikace v hlavním panelu - tray icon

Jan Šindelář - 12.6.2002

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.