Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Анимация сворачивания в трей, Свернуть в трей красиво!!! 
:(
    Опции темы
Poseidon
  Дата 11.2.2005, 05:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Здраствуйте.

Интересует такой вопрос: как заставить программу "свернуться" в трей? smile Именно "СВЕРНУТЬСЯ". Не создать в трее иконку и исчезнуть, а именно "улететь" в трей, так же как "улетают" окна на панель задач. smile
Для примера, так делает Антивирус Касперского. При закрытии не просто исчезает, а "улетает" в трей.

Ну и соответственно, как "прилететь" обратно. smile

Спасибо.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Snowy
Дата 11.2.2005, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Не знаю как улетает каспер (в радиусе 3-х километров его нигде нет, так что глянуть не могу).
Но, если тебе нужно улетное сворачивание, то придется рисовать самому.
Фотографируешь свое окно, фотографируешь десктоп. Потом убираешься в трей, как обычно, а на десктопе разводишь мультики. Тут уж кто во что горазд.
PM MAIL   Вверх
~FoX~
Дата 11.2.2005, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



Snowy
Ты крут. smile

Poseidon
Все немного проще
Ты сварачиваешь окно как обычно (не в трэй а на панель задач), появляется эффект анимации, ну а уже потом:

Код

TrayIc(1,ico);
ShowWindow(Handle, SW_HIDE);
ShowWindow(Application.Handle, SW_HIDE);

Только сворачиваться будет немного не в ту сторону, но это скорее всего тоже можно исправить.


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Akella
Дата 11.2.2005, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Код

 AnimateWindow(Handle, 300, AW_VER_POSITIVE or AW_VER_NEGATIVE);
 AnimateWindow(Handle, 300, AW_VER_POSITIVE AND AW_VER_NEGATIVE);


function AnimateWindow(hwnd: HWND, dwTime: DWord, dwFlags: DWord);

Параметры

hwnd - Дескриптор окна, которое анимируется. Вызывающий поток должен владеть этим окном.
dwTime - Устанавливает, сколько необходимо времени, чтобы воспроизвести мультипликацию, в миллисекундах. Как правило, воспроизведение мультипликации занимает 200 миллисекунд.
dwFlags - Определяет тип мультипликации. Этот параметр может быть одно или несколько нижеследующих значений. Обратите внимание! что, по умолчанию, эти флажки дают желаемый результат при показе окна. Чтобы получать желаемый результат при сокрытии окна, используйте флажок AW_HIDE и логический оператор OR с соответствующими флажками.
AW_SLIDE Использует слайдовую анимацию. По умолчанию используется анимационный ролик (прокрутка мультипликации). Этот флажок игнорируется тогда, когда пользуется с флажком AW_CENTER.
AW_ACTIVATE Активизирует окно (при показе окна). Не используйте это значение совместно с AW_HIDE.
AW_BLEND Использует эффект постепенного изменения прозрачности окна. Этот флажок может быть использован только в том случае, если параметр hwnd - окно верхнего уровня.
AW_HIDE Скрывает окно. По умолчанию, окно показывается на экран.
AW_CENTER Делает вид окна сжатым в точку, если используется флажок AW_HIDE или раскрытым из точки до полного размера, если флажок AW_HIDE не используется. Различные предписывающие флаги не имеют никакого действия.
AW_HOR_POSITIVE Анимирует окно слева направо. Этот флажок может быть использован с роликом или слайдом мультипликации. Он игнорируется, когда используется с флажком AW_CENTER или AW_BLEND.
AW_HOR_NEGATIVE Анимирует окно справа налево. Этот флажок может быть использован с роликом или слайдом мультипликации. Он игнорируется, когда используется с флажком AW_CENTER или AW_BLEND.
AW_VER_POSITIVE Анимирует окно сверху вниз. Этот флажок может быть использованы с роликом или слайдом мультипликации. Он игнорируется, когда используется с флажком AW_CENTER или AW_BLEND.
AW_VER_NEGATIVE Анимирует окно снизу вверх. Этот флажок может быть использован с роликом или слайдом мультипликации. Он игнорируется, когда используется с флажком AW_CENTER или AW_BLEND.
Возвращаемые значения

Если функция завершается успешно, величина возвращаемого значения - не ноль. Если функция завершается с ошибкой, величина возвращаемого значения - ноль. Функция завершится ошибкой в нижеследующих ситуациях: Если окно использует регион окна. Windows XP: Это обстоятельство не заставляет функцию завершаться ошибкой. Если окно уже видимое, и Вы пробуете выводить на экран окно. Если окно уже скрытое, и Вы пробуете скрыть окно. Если нет заданного направления прокрутки для слайда или ролика. При попытке анимировать дочернее окно с флажком AW_BLEND. Если поток не владеет окном. Обратите внимание! что, в этом случае функция AnimateWindow завершается ошибкой, а GetLastError возвращает значение ERROR_SUCCESS. Чтобы получать расширенные данные об ошибках, вызовите функцию GetLastError.

Замечания

При использовании слайда или прокрутки мультипликации, Вы должны задать направление. Это может быть или AW_HOR_POSITIVE, AW_HOR_NEGATIVE, AW_VER_POSITIVE, или AW_VER_NEGATIVE. Вы можете комбинировать флажки AW_HOR_POSITIVE или AW_HOR_NEGATIVE с AW_VER_POSITIVE или AW_VER_NEGATIVE, чтобы анимировать окно по диагонали. Оконные процедуры для окна и его дочерних окон должны обрабатывать любое сообщение WM_PRINT или WM_PRINTCLIENT. Диалоговые окна, органы управления и стандартные органы управления уже обрабатывают WM_PRINTCLIENT. Заданная по умолчанию оконная процедура уже обрабатывает WM_PRINT. Если дочернее окно отображается частично отсеченным, когда оно анимируется, то будет иметь дырки, где оно отсечено. AnimateWindow поддерживает окна RTL. Избегайте анимировать окно, которое имеет тень, потому что оно производит видимое спонтанное дерганье мультипликации.

Вот примерчики:
Код

procedure TForm1.FormShow(Sender: TObject);
begin
 AnimateWindow(Handle, 500, AW_CENTER or AW_SLIDE);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 AnimateWindow(handle, 500, AW_BLEND or AW_HIDE);
end;

PM MAIL   Вверх
Poseidon
Дата 13.2.2005, 02:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Спасибо всем smile , но...


Snowy
По-моему Вы все усложнили до крайности. Не может быть все настолько запущено. Должна быть простая функция. Но если уж все на самом деле ток сложно, то может поможите с кодом?



~FoX~
Хорошо, но все же не то.
Функции ShowWindow(Handle, SW_HIDE); и ShowWindow(Application.Handle, SW_HIDE); заставят ИСЧЕЗНУТЬ окно, а нужен эфект "улетания" окна в ПРАВЫЙ НИЖНИЙ угол (в трей по-простому). Что же касается TrayIc(1,ico);, то уточните пожалуйста, в каком модуле находится эта функция и что она вообще из себя прадставляет?



dsergey
Интересная функция, интересные примеры, интересные результаты. Но все же ЭФЕКТ НЕ ТОТ! Повторю, что необходимо не просто заставить исчезнуть окно (с анимацией или без оной), а заставить окно свернуться в трей, произвести эфект улетания в трей. Так же, как "улетает" окно на панель задач при сворачивании, только в трей, т.е. не просто вниз, а в нижний-правый угол.

smile


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Poseidon
Дата 19.2.2005, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Мне так никто толком и не помог smile
Приходится поднимать тему заново.
Наверное я плохо обьясняю, что именно мне нужно, потому что в то, что никто не знает (или в то, что это невозможно средствами Делфи) верится не хочется.

Попробую объяснить на примере Дельфи.
Во время проектирования приложения, если нажать на кнопку "Свернуть" например формы (повтарюсь, не во время исполнения, а во время редактирования), то форма "улетает" в нижний левый угол и прячится там. Так вот нужно что-то подобное, только что бы это происходило в направлении нижнего ПРАВОГО угла. И если потом спрятать форму той же командой
Код
ShowWindow(Form1.Handle,SW_HIDE)
то получится эффект "улетания в трей".

Так вот, как свернуть прогу в левый угол я нашел (если нужно, то выложу код), а вот как изменить направления на правый угол, ВОТ ЗАДАЧА smile


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
ДЫМ
Дата 20.2.2005, 03:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 6.1.2004

Репутация: 8
Всего: 8



Цитата
как изменить направления на правый угол, ВОТ ЗАДАЧА 

Если не получается добиться результата стандартными средствами, попробуем подойти к проблеме творчески и напишем анимацию сами (см. код). Задача сводится к тому, что форма будет перемещаться по прямой от точки с первоначальными координатами левого верхнего угла до точки с координатами правого нижнего угла экрана. Попутно будем пропорционально уменьшать ширину окна (предварительно установив минимальную высоту).

Предложенное решение имеет свои преимущества - можно свернуть окно в любую точку экрана, установить шаг,
можно пропорционально уменьшать и высоту при приближении к точке, все будет работать даже если у пользователя откючена "Анимация окон при сворачивании и разворачивании". smile


Код

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var Dest,k:Real;
   Xv,Yv,Xt,Yt,X1,Y1,X2,Y2,d,w:Integer;
   TempBitmap: TBitmap;
begin
// шаг анимации
d:=40;

// координаты конечной точки
X2:=Screen.Width-40;
Y2:=Screen.Height-10;
// убираем закладку с панели задач
ShowWindow (Application.handle, SW_HIDE);

// убираем заголовок
Form1.BorderStyle:=bsNone;
if WindowState=wsMaximized then WindowState:=wsNormal;
FormStyle:=fsStayOnTop;

// имитируем заголовок
ClientHeight:=17;
Color:=clActiveCaption;
Canvas.Font.Color:=clWhite;
Canvas.Font.Style:=[fsBold];
Form1.Refresh;

// создаем Bitmap и рисуем на нем иконку для того, чтобы
// потом нарисовать методом StretchDraw
TempBitmap := TBitmap.Create;
TempBitmap.Width := Application.Icon.Width;
TempBitmap.Height := Application.Icon.Height;
TempBitmap.Canvas.Draw(0, 0, Application.Icon);
TempBitmap.Transparent:=True;

// шаг уменьшения ширины окошка
w:=Round(Form1.Width/(Sqrt(Sqr(X2-Form1.Left)+Sqr(Y2-Form1.Top))/d));

While True do
 begin
  X1:=Form1.Left;
  Y1:=Form1.Top;
  //--------------------- смещаемся по прямой вниз --------------------
  // координаты вектора
  Xv:=X2-X1;
  Yv:=Y2-Y1;
  if (Xv<0) or (Yv<0) then Break;
  // длина вектора
  Dest:=Sqrt(Sqr(Xv)+Sqr(Yv));
  // коэффициент
  k:=d/Dest;
  // координары конца вектора
  Xt:=Round(Xv*k+X1);
  Yt:=Round(Yv*k+Y1);

  Form1.Left:=Xt;
  Form1.Top:=Yt;
  //--------------------------------------------------------------------

  // уменьшаем ширину окна
  Width:=Width-w;
//  ClientHeight:=ClientHeight-w;
  // выводим заголовок и рисуем иконку
  Form1.Canvas.StretchDraw(Rect(1,1,16,16),TempBitmap);
  Form1.Canvas.TextOut(18,1,Form1.Caption);
  sleep(10);
 end;//while

TempBitmap.Free;
end;


А так с помощью Win API
Код

...
ShowWindow (Application.handle, SW_HIDE);
DrawAnimatedRects(Form1.Handle, IDANI_CAPTION, Form1.BoundsRect,
Rect(Screen.Width,Screen.Height,Screen.Width,Screen.Height));
...






PM MAIL WWW   Вверх
Poseidon
Дата 22.2.2005, 03:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Вот спасибо ДЫМ. Попробовал код с помощью Win API и вышло то, что нужно. Только вот вопросик. Как сделать обратную анимацию, т.е что бы окно "прилетало" назад. А так все ОК.

С первым кодом еще не разбирался, но идея интересная.



PS. Твоя помощь заслуживает повышения твоей рапутации, но у меня нет еще 100 сообщений что бы это сделать, так что прими просто слова благодарности. Спасибо.

(Думаю модераторы увидят твою помощь и оценят ее)

Это сообщение отредактировал(а) Poseidon - 22.2.2005, 03:31


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
ДЫМ
Дата 23.2.2005, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 6.1.2004

Репутация: 8
Всего: 8



Наверное, ты уже разобрался, но отвечу.
А в обратном порядке не пробовал?

Код

DrawAnimatedRects(Form1.Handle, IDANI_CAPTION, Rect(Screen.Width,Screen.Height,Screen.Width,Screen.Height),Form1.BoundsRect,
);



PM MAIL WWW   Вверх
Poseidon
Дата 23.2.2005, 03:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата
Наверное, ты уже разобрался, но отвечу.
А в обратном порядке не пробовал?


Да, попробовал в обратном порядке и все прошло как и ожидалось. Еще раз спасибо.


PS. Так же спасибо ALEX. Думаю и он и ты знаете за что...


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0897 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.