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ě.
|