Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Анимация иконки в System Tray


Автор: h2o 1.9.2005, 16:55
Прочитал тему http://forum.vingrad.ru/index.php?showtopic=53183
Как всегда - вопрос не разрешился! Там просто дали ссылку на компонент, который не ставится!

И всё же, как сделать чтобы иконка была анимированной?

Я так полагаю, что нужно несколько рисунков иконок менять с задержой.

Пробовал вот что, теперь уже понимаю что глупость:

Код

Shell_NotifyIcon( NIM_ADD, @nid ); //тут картинка 1
while form1.active do
begin
 hIcon := Application.Icon.Handle_версия2; // тут меняем картинку на 2ю
 Shell_NotifyIcon( NIM_NIM_MODIFY , @nid );
 sleep(2); //ждём 2 секунды
 hIcon := Application.Icon.Handle; //тут опять на первую
 sleep(2); //ждём 2 секунды


но глупость какая-то получается! как hIcon с Application.Icon.Handle на другую заменить?

какой вообще есть вариант анимации, может кто скажет?
Добавлено @ 16:55
код Делфи! Делаю на Делфи 6!

Автор: Poseidon 1.9.2005, 17:06
Посмотри для начала http://forum.vingrad.ru/index.php?showtopic=55210. Если что не понятно - спрашивай
Добавлено @ 17:10
В твоем коде ошибка в том, что иконка меняется не 4 и 7 строчкой, а 5. Поэтому ничего не меняется. И вообще код какой-то странный

Автор: Poseidon 1.9.2005, 17:20
Вот набрасал на скорую руку. С комментами. Ты должен разобратся.

На форме: Button1, OpenDialog1

Код
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses ShellApi;

procedure TForm1.FormCreate(Sender: TObject);
var nid : TNotifyIconData;
begin
  //Добавляем иконку в трей при старте программы:
  with nid do  //Указываем параметры иконки, для чего используем структуру
               //TNotifyIconData.
  begin
    cbSize := SizeOf( TNotifyIconData ); //Размер все структуры
    Wnd := Form1.Handle; //Здесь мы указывает Handle нашей главной формы
                         //которая будет получать сообщения от иконки.
    uID := 1;            //Идентификатор иконки
    uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP; //Обозначаем то, что в
                                                  //параметры входят:
                                                  //Иконка, сообщение и текст
                                                  //подсказки (хинта).
    uCallbackMessage := WM_USER + 100;            //Здесь мы указываем, какое
                                                  //сообщение должна  высылать
                                                  //иконочка нашей главной форме,
                                                  //в тот момент, когда на ней
                                                  //(иконке)  происходят
                                                  //какие-либо события
    hIcon := Application.Icon.Handle;             //Указываем на Handle
                                                  //иконки (изображения)
                                                  //(в данной случае берем
                                                  //иконку основной формы
                                                  //приложения. Ниже Вы увидите
                                                  //как можно ее изменить)
    StrPCopy(szTip, Form1.Caption);                //Указываем текст всплывающей
                                                  //посдказки, который берем из
                                                  //Form1.Caption,
  end;
  Shell_NotifyIcon( NIM_ADD, @nid );  //Собственно добавляем иконку в трей:)
                                      //Обратите внимание, что здесь мы исползуем константу
                                      //NIM_ADD (добавление иконки).
end;




procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var nid : TNotifyIconData;
begin
  with nid do
  begin
    cbSize := SizeOf( TNotifyIconData );
    Wnd := Form1.Handle;
    uID := 1;
    uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
    uCallbackMessage := WM_USER + 100;
    hIcon := Application.Icon.Handle;
    StrPCopy(szTip, Form1.Caption);
  end;
  Shell_NotifyIcon( NIM_DELETE, @nid );
  //Удаляем иконку из трея. Параметры мы вводим для того,
  //чтобы функция точно знала, какую именно иконку надо удалять.
  //Обратите внимание, что здесь мы исползуем константу
  //NIM_DELETE (удаление иконки).
end;


procedure TForm1.Button1Click(Sender: TObject);
var I   : TIcon;
    nid : TNotifyIconData;
begin
  //Здесь мы меням иконку приложения, для чего используем диалоговое окно
  //(для выбора файла, который содержит изображение иконки)
  if OpenDialog1.Execute then //Запуск диаголового окна
  begin
    I:=TIcon.Create; //Создаем объект I типа TIcon
    I.LoadFromFile(OpenDialog1.Filename); //Теперь загружаем в него изображение
                                          //из того файла, который был выбран в
                                          //окне диалогового окна
    //Далее делаем все тоже самое, что и раньше, создаем структуру типа
    //TNotifyIconData куда заносим все параметры иконки:)
    with nid do
    begin
      cbSize := SizeOf( TNotifyIconData );
      Wnd := Form1.Handle;
      uID := 1;
      uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
      uCallbackMessage := WM_USER + 100;
      hIcon := I.Handle;
      StrPCopy(szTip, Form1.Caption);
    end;
    Shell_NotifyIcon( NIM_MODIFY , @nid );
    //А вот здесь мы заносим изменения в иконку, которая находится в системном
    //трее обратите внимание, что здесь мы исползуем константу NIM_MODIFY
    //(изменение иконки).
    I.Free;
  end;
end;

end.

Автор: h2o 2.9.2005, 15:47
да я всё это прочитал!
дак я всё равно не понимаю как анимацию зделать!!!
нужно: добавить иконку в трэй а потом менять рисунки например подряд 3 штуки через интервал времени 1 секунда.

Shell_NotifyIcon( NIM_ADD, @nid );


Цикл, пока работает программа
меняем рисункок как-то на рисунок1
Shell_NotifyIcon( NIM_MODIFY , @nid );
ждём;
меняем рисункок как-то на рисунок2
Shell_NotifyIcon( NIM_MODIFY , @nid );
ждём;
меняем рисункок как-то на рисунок3
Shell_NotifyIcon( NIM_MODIFY , @nid );
ждём;

Дак или как мне в прогу загрузить 3 иконки и менять их в трэе, чтобы анимация получилась???

ну кто-то должен знать?

я в компонентах смотрел, но там так всё задвинуто что я просто не разобрался...

Автор: _hunter 2.9.2005, 16:05
nid.hIcon = icon2
и меняй себе...

Автор: Poseidon 2.9.2005, 18:38
Цитата(h2o @ 2.9.2005, 15:47)
Дак или как мне в прогу загрузить 3 иконки и менять их в трэе, чтобы анимация получилась???
Используй компонент TImageList

Автор: dvamaster 2.9.2005, 18:55
Пример из исходника моего ScreenShotSaver.

Код

...

var
  IconFrames: array [0..7] of HICON;
  Frame: Integer;
  NID: NOTIFYICONDATA;

...

procedure ChangeNotifyIcon(Wnd: HWND; uMsg: UINT; idEvent: UINT; dwTime: DWord); stdcall;
begin
  if not ExecuteScan then Exit;
  Frame := (Frame + 1) and 7;
  SendMessage(Wnd, WM_SETICON, ICON_SMALL, IconFrames[Frame]);
  NID.hIcon := IconFrames[Frame];
  Shell_NotifyIcon(NIM_MODIFY, @NID);
end;

procedure InitNotifyIcon(Wnd: HWND);
begin
  Frame := 0;
  IconFrames[0] := LoadIcon(HInstance, PChar(101));
  IconFrames[1] := LoadIcon(HInstance, PChar(102));
  IconFrames[2] := LoadIcon(HInstance, PChar(103));
  IconFrames[3] := LoadIcon(HInstance, PChar(104));
  IconFrames[4] := LoadIcon(HInstance, PChar(105));
  IconFrames[5] := LoadIcon(HInstance, PChar(106));
  IconFrames[6] := LoadIcon(HInstance, PChar(107));
  IconFrames[7] := LoadIcon(HInstance, PChar(108));
  NID.cbSize := SizeOf(NOTIFYICONDATA);
  NID.Wnd := Wnd;
  NID.uID := 1000;
  NID.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
  NID.uCallbackMessage := WM_ICON;
  NID.hIcon := IconFrames[0];
  NID.szTip := 'ScreenShotSaver';
  Shell_NotifyIcon(NIM_ADD, @NID);
  SetTimer(Wnd, 1, 125, @ChangeNotifyIcon);
...
end;

procedure DoneNotifyIcon(Wnd: HWND);
begin

...

  KillTimer(Wnd, 1);
  Shell_NotifyIcon(NIM_DELETE, @NID);
  DestroyIcon(IconFrames[7]);
  DestroyIcon(IconFrames[6]);
  DestroyIcon(IconFrames[5]);
  DestroyIcon(IconFrames[4]);
  DestroyIcon(IconFrames[3]);
  DestroyIcon(IconFrames[2]);
  DestroyIcon(IconFrames[1]);
  DestroyIcon(IconFrames[0]);
end;

...

Автор: h2o 5.9.2005, 13:17
а куда тут картинки вставлять? в "IconFrames[0] := LoadIcon(HInstance, PChar(101));"?
а как вставлять??? Хотя метод анимации вроде бы мне понятен. сегодня попробую!

Цитата

Используй компонент TImageList

а как? Я уже пробовал, но классы не соответсвуют. к примеру я загрухил на форму 3 рисунка и что дальше???
hicon не = Ticon, а = Ticon.handle
и как не крути Ticon не = Timage (а в нём мои 3 рисунка на форме). Тоже самое и с TimageList.
Как тут быть?
Добавлено @ 13:17
smile

Автор: h2o 6.9.2005, 13:55
вообщем пофиг! я компонент установил! всё работает теперь!

можно больше не отвечать! спасибо всем!

Автор: dvamaster 6.9.2005, 19:51
Навсякий случай отвечу

Код

IconFrames[0] := LoadIcon(HInstance, PChar(101));


это загрузка кадра из ресурса

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)