Delphi

Ikony v liště

Při programování v Delphi pod Windows 95 jsem potřeboval umístit ikonu aplikace do nástrojové lišty (vedle hodin). Protože je tato činnost dobře zdokumentovaná, není to žádný problém. Nabízím tu tedy tři procedury, které umožní vkládání, změnu a odstranění ikony z lišty. Zajímavé je ale něco jiného. Protože jsou procedury zkopírované z examplů v Céčku, musel jsem je upravit. Delphi 2.0 ale podporují i datové typy Windows, proto jsou úpravy kódu minimální:

function MyTaskBarAddIcon(hwnd:HWND;uID:UINT;hicon:HICON;lpszTip:LPSTR): BOOL;
var res: BOOL;
   tnid: TNOTIFYICONDATA;
begin
 tnid.cbSize:=sizeof(TNOTIFYICONDATA);
 tnid.Wnd:=hwnd;
 tnid.uID:=uID;
 tnid.uFlags:=NIF_MESSAGE or NIF_ICON or NIF_TIP;
 tnid.uCallbackMessage:=WM_USER;
 tnid.hIcon:=hicon;
 if BOOL(lpszTip) then lstrcpyn(tnid.szTip,lpszTip,sizeof(tnid.szTip))
                  else tnid.szTip[0] := #0;
 res:=Shell_NotifyIcon(NIM_ADD, @tnid);
 if BOOL(hicon) then DestroyIcon(hicon);
 result := res;
end;

function MyTaskBarChangeIcon(hwnd:HWND;uID:UINT;hicon:HICON;lpszTip:LPSTR): BOOL;
var res:BOOL;
   tnid:TNOTIFYICONDATA;
begin
 tnid.cbSize:=sizeof(TNOTIFYICONDATA);
 tnid.Wnd:=hwnd;
 tnid.uID:=uID;
 tnid.uFlags:=NIF_MESSAGE or NIF_ICON or NIF_TIP;
 tnid.uCallbackMessage:=WM_USER;
 tnid.hIcon:=hicon;
 if BOOL(lpszTip) then lstrcpyn(tnid.szTip,lpszTip,sizeof(tnid.szTip))
                  else tnid.szTip[0]:=#0;
 res:=Shell_NotifyIcon(NIM_MODIFY, @tnid);
 if BOOL(hicon) then DestroyIcon(hicon);
 result:=res;
end;

function MyTaskBarDeleteIcon(hwnd:HWND;uID:UINT): BOOL;
var res:BOOL;
   tnid:TNOTIFYICONDATA;
begin
 tnid.cbSize:=sizeof(TNOTIFYICONDATA);
 tnid.Wnd:=hwnd;
 tnid.uID:=uID;
 res:=Shell_NotifyIcon(NIM_DELETE, @tnid);
 result:=res;
end;

V programu se procedury volají například:

MyTaskBarAddIcon(Handle, 0, LoadIcon(HInstance,'JménoIkony'), PCHAR(Application.Title))

Kde hwnd=Handle je globální proměnná a tu už každá aplikace zná (je to handle (vlastně specifické číslo) formuláře), uID=0 je pořadové číslo vložené ikony (to kdyby vám jedna nestačila), hicon=LoadIcon (HInstance,'Jménoikony') je handle ikony (já jí funkcí LoadIcon natahuji ze zdrojů aplikace; vkládám ji tedy do RES souboru k ikoně aplikace a jiným zdrojům), lpszTip=PCHAR(Application.Title) je text v bublině nad ikonou v liště (v tomto případě jen kopíruji jméno aplikace).

MyTaskBarChangeIcon(Handle, 0, LoadIcon(HInstance,'JménoJinéIkony'), PCHAR(Application.Title));

Změna ikony je podobná vložení ikony do lišty.

MyTaskBarDeleteIcon(Handle,0);

Odstranění ikony je jednoduché...

Do definice metod public formuláře vložte prosím ješte řádek:
 procedure WMUser (var msg:TMessage);message wm_user;
a do kódu:
procedure TForm1.WMUser (var msg:TMessage);
begin
 if msg.lParam=WM_LBUTTONUP then
 begin
  {sem vložte kód, který má být vykonán}
  {při uvolnění tlačítka nad ikonou v liště}
 end;
end;

Tím jsme do programu přidali proceduru, která je volaná vždy, když se něco děje na naší ikoně (systém posílá aplikaci uživatelsky definovanou zprávu, otestujeme, jestli to není uvolnění levého tlačítka myši...).

Aby šel program přeložit, je nutné nadefinovat v části uses ještě knihovnu ShellApi pro práci s ikonou v liště.

Směr