![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Мигание в System Tray [D6, Win2k]
AloneAli © (2004-03-02 15:23:00)Как заставить мигать иконку программы в System Tray?
AloneAli (2004-03-05 10:27:00) [1]Спасибо!
Gero (2004-03-05 08:59:00) [2]> как засунуть иконку в ресурсы
Image Editor или brcc32.exe
AloneAli (2004-03-05 07:02:00) [3]
> Klev (04.03.04 16:20) [4]
> hIcon1 := loadicon(hInstance,makeintresource(3)); //твоя
> иконка взята из ресурсов, ее ид=3 -первоначальная иконка
Хотя я уже сделал мигание в SystmeTray'е, у меня единственный вопрос, как засунуть иконку в ресурсы?
Klev (2004-03-04 16:20:00) [4]Лучшим советом всегда является наглядный пример:
(На работоспособность не проверялось, но в теории должно работать.)
Удаление иконки.
handle - hwnd окна
n - число - индетификатор TrIc
TrayIcon - переменная, которая = true если иконка существует, и соответственно false, если Explorer перезагрузился (глюки, итп) и иконки более нет в трее. (Что-то типа AVPmon)
const
WM_MYTRAYNOTIFY = WM_USER + 123; - индетификатор сообщения, посылаемого окну, при проишествии всякой всячины с иконкой в трее (щелчок мышью, итп) - обработку этого сообщение надо реализовать в оконной процедуре.
var
TrayIcon, i:bool;
hicon1,hicon2:Dword;
первым делом подгружаем иконки:
hIcon1 := loadicon(hInstance,makeintresource(3)); //твоя иконка взята из ресурсов, ее ид=3 -первоначальная иконка
hIcon2 := loadicon(hInstance,makeintresource(4)); //твоя иконка взята из ресурсов, ее ид=4 -иконка, на которую будет изменяться первоначальная иконка через 0.5 сек.
nidata -TNotifyIconData - структура, описание которой приведено в MSDN.
procedure DeleteTrayIcon(n: integer);
var
nidata: TNotifyIconData;
begin
with nidata do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Handle;
uID := n;
end;
Shell_NotifyIcon(NIM_DELETE, @nidata);
TrayIcon:=false;
end;
Создание иконки.
procedure CreateTrayIcon(n: integer);
var
nidata: TNotifyIconData;
begin
with nidata do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Handle;
uID := n;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage := WM_MYTRAYNOTIFY;
hIcon := hicon1; //твоя иконка взята из ресурсов, ее ид=3 -первоначальная иконка
szTip := 'My icon'; //не более 60 символов
end;
Shell_NotifyIcon(NIM_ADD, @nidata);
TrayIcon:=true; //- иконка создана
end;
процедура модификации иконки, ее надо повесить на таймер.
procedure ModTrayIcon(n: integer;ho,mi,se:word);
var
nidata: TNotifyIconData;
s:string;
r:word;
begin
if trayicon=false then exit;
s:= pchar('My Tricon');
with nidata do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Handle;
uID := n;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage := WM_MYTRAYNOTIFY;
if i=false then begin
hIcon := hicon2;//меняем на новую иконку
i:=true;
end else begin
hIcon := hicon1;//меняем на первоначальную иконку
end;
szTip[r]:=Pchar('My icon');
end;
if not Shell_NotifyIcon(NIM_MODIFY, @nidata) then begin
//если по к-л причинам нашей иконки больше нет, то воссоздаем ее
deletetrayicon(1);
createtrayicon(1);
end;
end;
Это кажется все, что надо. Возможно что-то забыл. Хотя вышеприведенного материала должно хватить даже для написания туториала по этому вопросу.
Vlad25 (2004-03-03 21:01:00) [5]Можешь использовать LMD TrayIcon (LMD Components), но там как раз реализуется "неэлегантный" способ. Видимо, больше это никак не сделать.
AloneAli (2004-03-03 06:36:00) [6]А по другому нельзя? О том, что ты предложил и сделал, но думал может есть другой способ, более элегантнее...
Asdor (2004-03-02 16:13:00) [7]Взять две иконки и менять их через 0.5 сек...