Zobrazování ikony v trayi - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Delphi

Zobrazování ikony v trayi

26. června 2001, 00.00 | Co je to systémový tray, to asi každý ví - malá oblast s
ikonami vedle hodin na hlavním panelu. Dnes se dovíte, jak do traye umístit ikonu své aplikace.

Co je to systémový tray, to asi každý ví - malá oblast s ikonami vedle hodin na hlavním panelu. Ale ne každý už ví, jakým způsobem do traye dostat ikonku své aplikace. V dnešním článku máte možnost se to dovědět.

Jako obvykle si vypomůžeme ukázkovou aplikací, na které bude vše vysvětleno. Její funkce se dá charakterizovat několika body:

  • po dobu běhu bude skrytá (nebude mít tedy žádné viditelné okno) a bude zobrazovat jen svou ikonu v trayi
  • při kliknutí na ikoně levým tlačítkem myši se objeví jednoduché hlášení
  • při kliknutí pravým tlačítkem naskočí menu o jedné položce, umožňující ukončení aplikace (viz obrázek)
Bod první

Aplikaci vytvoříme normálně v Delphi pomocí menu File|New Application... Její hlavní formulář sice nebude zobrazen, ale existovat bude, protože a něj vložíme komponentu PopupMenu a také pomocí něj budeme přijímat některé zprávy od Windows. Skrytí formuláře zařídíme tak, že v souboru projektu (View|Project Source) upravíme inicializační sekvenci do následujícího tvaru:

begin
  Application.Initialize;
  Application.ShowMainForm := False; // potlačení viditelnosti hlav. formuláře
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Bod druhý a třetí

Nyní se podívejme, jak přidat ikonu do traye. Slouží k tomu API funkce Shell_NotifyIcon (deklarovaná v unitě ShellAPI), která má dva parametry. První určuje, co vlastně chceme dělat, a může nabývat těchto hodnot:

NIM_ADD přidání ikony
NIM_DELETE odebrání ikony
NIM_MODIFY úprava ikony nebo některé z jejích vlastností

Druhý parametr je odkaz na strukturu typu TNotifyIconData, která ve svých položkách obsahuje různá data potřebná pro zobrazení ikony. Vše shrnuje následující tabulka:

cbSize velikost struktury v bytech
Wnd handle okna, které bude přijímat zprávy související s ikonou
uID identifikátor ikony v rámci aplikace (důležité, pokud aplikace přidává do lišty víc ikon)
uFlags bitové pole indikující, které položky struktury jsou naplněny
uCallbackMessage identifikátor zprávy posílané při událostech myši (přejíždění, klikání) nad ikonou
hIcon handle zobrazované ikony
szTip tooltip

Co budeme muset deklarovat v aplikaci někde předem, je identifikátor zprávy (později předaný do položky uID) a samozřejmě samotná struktura NoifyIconData:

const
  WM_TRAYAPPNOTIFY = WM_USER; // vlastní identifikátor zprávy

var
  NotifyIconData: TNotifyIconData; // data pro ikonu

Pak už můžeme napsat obsluhu událostí OnCreate a OnDestroy hlavního formuláře:

procedure TForm1.FormCreate(Sender: TObject);
begin
  // nastavíme jednotlivé položky
  with NotifyIconData do
  begin
    cbSize := SizeOf(NotifyIconData);
    Wnd := Handle;
    uID := 0;
    uFlags := NIF_ICON + NIF_MESSAGE + NIF_TIP;
    uCallbackMessage := WM_TRAYAPPNOTIFY;
    hIcon := Application.Icon.Handle;
    szTip:='Pokusná tray aplikace';
  end;
  // přidáme ikonu na lištu
  Shell_NotifyIcon(NIM_ADD, @NotifyIconData);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  // odebereme ikonu z lišty
  Shell_NotifyIcon(NIM_DELETE, @NotifyIconData);
end;

Nyní musíme napsat obsluhu zprávy WM_TRAYAPPNOTIFY. Pomocí ní nás Windows budou informovat o akcích, které uživatel nad ikonou v trayi provádí. Proceduru musíme deklarovat už v sekci private nebo public hlavního formuláře (kterou si vybereme je v tomto případě celkem jedno):

...
public
  { Public declarations }
  procedure WMTrayAppNotify(var M: TMessage); message WM_TRAYAPPNOTIFY;
end;

Při zaslání zprávy se v parametru lParam předává identifikátor zprávy, pomocí kterého určíme, co přesně myš s ikonou prováděla (přejíždění, klikání tlačítky apod.). Podle hodnoty tohoto parametru buď zobrazíme hlášení, nebo kontextové menu. Také nesmíme zapomenout doplnit obsluhu kliknutí myši na položce menu. Procedury vypadají následovně:

procedure TForm1.WMTrayAppNotify(var M: TMessage);
var
  P: TPoint;
begin
  with M do
    case lParam of
      WM_LBUTTONUP:   // levé tlačítko
        Application.MessageBox('Na ikoně bylo kliknuto!', 'Tray', 0);
      WM_RBUTTONUP:   // pravé tlačítko
      begin
        GetCursorPos(P);             // získáme souřadnice kurzoru
        PopupMenu1.Popup(P.X, P.Y);  // a zobrazíme na nich menu
      end;
    end;
end;

...

procedure TForm1.Konec1Click(Sender: TObject);
begin
  // ukončíme aplikaci
  Close;
end;
Závěr

Tak, to by bylo k tématu ikona v tray vše. Snad bych jen měl dodat, že výše uvedené postupy zapouzdřují i některé komponenty, jedna je např. součástí známé knihovny RX Library.

Ukázkovou aplikaci i se zdrojovým kódem pro Delphi 3 a vyšší si můžete stáhnout zde.

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: