Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Мигание в 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 сек...


Наверх

Титульная страница Поиск, карта сайта Написать письмо