Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Анимированная иконка в трее  (Прочитано 18995 раз)
0 Пользователей и 1 Гость смотрят эту тему.
kr
Гость
« : 11-02-2010 19:57 » 

 С ума сойти...
Подскажите пожалуйста как анимировать иконку в трее ?
На форме анимация работает. А в трее нет. Где и чего нужно исправить?
Может, кто подскажет !
Буду очень благодарен!

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ImgList, Menus, ExtCtrls,ShellApi, StdCtrls;

type
  TForm1 = class(TForm)
    ImageList1: TImageList;
    Timer1: TTimer;
    PopupMenu1: TPopupMenu;
    Form11: TMenuItem;
    Exit1: TMenuItem;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Exit1Click(Sender: TObject);
    procedure PopupMenu1Popup(Sender: TObject);
    procedure Form11Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    procedure WMSysCommand(var Msg: TWMSysCommand);message WM_SYSCOMMAND;
    { Private declarations }
  public
   {Здесь мы объявлем процедуру, которая будет выполнятся каждый раз, когда
на иконке будет происходит какое-либо событие (клик мышки и т.п.)}
    procedure IconCallBackMessage( var Mess : TMessage ); message WM_USER + 100;
    { Public declarations }
  end;

var
  Form1: TForm1;
  iconindex : Integer;


implementation

{$R *.dfm}
// Отлавливаем момент если форма сворачивается,тогда выполнить что-либо?
procedure TForm1.WMSysCommand;
begin
if Msg.CmdType = SC_MINIMIZE
then
//Сдесь делаем что нужно}
Form1.Hide;
else
inherited;
end;

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

procedure TForm1.Timer1Timer(Sender: TObject);
begin
// Перерисовываем иконку
ImageList1.GetIcon(iconindex, Application.Icon);
iconindex := iconindex + 1;
if iconindex > 1
then
iconindex := 0;
end;

procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
SetForegroundWindow(Form1.Handle);
end;

procedure TForm1.IconCallBackMessage( var Mess : TMessage );
begin
case Mess.lParam of
WM_LBUTTONUP :  Form11Click(Form1);  //'левоя кнопка мыши'
WM_RBUTTONUP : Form1.PopupMenu1.Popup(Mouse.CursorPos.x, Mouse.CursorPos.y);
end;
end;

procedure TForm1.Form11Click(Sender: TObject);
begin
//Показываем главное окно
Form1.Show;
Form1.Activate;
ShowWindow(Application.Handle, SW_HIDE);
end;

procedure TForm1.Exit1Click(Sender: TObject);
begin
Form1.Close
end;

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

procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Close
end;
end.


* Трее.7z (8.84 Кб - загружено 1068 раз.)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 12-02-2010 03:51 » 

в трее не бывает анимации - там надо по таймеру (или тактируя по иному) заменять картинку
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 12-02-2010 08:51 » 

Код очень плохо нечитается, но вроде как там по таймеру и сделано.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #3 : 12-02-2010 13:25 » 

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
// Перерисовываем иконку
ImageList1.GetIcon(iconindex, Application.Icon);
iconindex := iconindex + 1;
if iconindex > 1
then
iconindex := 0;
end;

по таймеру ты заменяешь иконку в приложении (Application.Icon), а кроме этого тебе надо здесь же обновить иконку в трее.
Записан

glGizma
Гость
« Ответ #4 : 14-04-2010 07:37 » 

Не насилуйте мозг, используйте: JVCL / JvTrayIcon
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 14-04-2010 07:47 » 

glGizma, а кто такое JVCL / JvTrayIcon ? ))
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #6 : 14-04-2010 07:56 » 

Алексей1153++, это потомок безвременно почившей либы RxLib.
Записан

glGizma
Гость
« Ответ #7 : 14-04-2010 08:37 » 

=) гугли вам помощь. Там есть всё, что нужно для счастья в среде программирования на Delphi. в общем работайте сами, рекомендую всем:
Цитата
h**p://cdnetworks-kr-1.dl.sourceforge.net/project/jvcl/JVCL%203/JVCL%203.39/JVCL339CompleteJCL211-Build3536.zip
« Последнее редактирование: 14-04-2010 08:42 от Алексей1153++ » Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #8 : 14-04-2010 11:59 » 

glGizma, вопрос был задан 2 месяца назад. стоит ли поднимать старую тему ради сомнительного совета ставить 100-меговую библиотеку с >50 компонентами вместо десятка строчек кода?

и что за говно по твоей ссылке? официальный сайт проекта - jvcl.jedi-vcl.org, а официальный дистрибутив 339 - это 75 мегабайт, а не 18.
Записан

glGizma
Гость
« Ответ #9 : 15-04-2010 01:53 » 

x77
Мне вообще по-барабашке, можешь сидеть и рвать, хоть целыми днями, пупок, когда можно обойтись всё одним кликом да + ещё этого дистрибутива достаточно, это и есть офф пак, если умный такой, что же не_рулишь на форуме, а ток критикуешь. И неважно старая или новая тема, посетители всегда найдуцо.
Записан
glGizma
Гость
« Ответ #10 : 15-04-2010 01:56 » 

х77 ты предлагал: (по таймеру ты заменяешь иконку), тока колхоз использует таймер, ты не_хуже меня понимаешь, что таймер для нубов да +ещё таймер забивает память, а ты через  мин 5-ть посмотри скоко он памяти закушает, так-что невариант твой вариант использовать, устаревший = я_б так даже сказал...
Записан
sss
Специалист

ru
Offline Offline

« Ответ #11 : 15-04-2010 02:10 » 

тормоза придумали трусы! А руль извращенцы!
Записан

while (8==8)
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 15-04-2010 04:40 » 

glGizma, Вот интересно - ты заглядывал в код рекламируемой тобой библиотеки? Если там эта функция есть - то она сделана по таймеру (я имею в виду таймер в понятии WinAPI, а не TTimer).
Хотя TTimer это всего лишь удобная обертка вокруг таймера WinAPI. Так что не гони волну что "таймер забивает память".
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 15-04-2010 05:01 » new

glGizma, хорош понтоваться. Делом займись. Хоть чем, что умеешь. Двор там подмети, бабушек вокруг светофора поводи
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #14 : 15-04-2010 12:44 » 

glGizma, ты сможешь это обосновать, что таймер через пять минут работы "закушает память"?
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines