Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.06.21;
Скачать: CL | DM;

Вниз

Анимация окна   Найти похожие ветки 

 
Trible   (2007-10-31 05:24) [0]

Как сделать в КОЛ, чтобы при запуске приложения происходил эффект анимации главного окна - прозрачность плавно изменялась от полупрозрачного до непрозрачного?


 
Compiler ©   (2007-10-31 12:43) [1]

Сойдет?

procedure TForm1.KOLFormFormCreate(Sender: PObj);
var
 i:integer;
begin
i:=0;
form.AlphaBlend:=0;
form.CreateWindow;
 while i<>  255 do
 begin
   Form1.form.AlphaBlend := i;
   Applet.ProcessMessages;
  inc(i);
 end;
end;


 
Trible   (2007-10-31 18:06) [2]


> Compiler ©   (31.10.07 12:43) [1]
> Сойдет?

Сойдет, спасибо. Вдогонку: а как обеспечить такую же анимацию при закрытии программы? Пробовал по OnClose для формы:


procedure TForm1.KOLFormClose(Sender: PObj);
var
i:integer;
begin
i:=255;
form.AlphaBlend:=255;
while i <> 0 do
begin
  Form1.form.AlphaBlend := i;
  Applet.ProcessMessages;
 dec(i);
end;
end;


Так вот, при закрытии форма почему-то чернеет на секунду, а потом уже идет анимация (изменение аьфа-бленда). Как побороть?


 
Compiler ©   (2007-11-01 01:25) [3]

Еще хороший способ.
AnimateWindow(form.handle, 2000, AW_BLEND or AW_HIDE);


 
Trible   (2007-11-01 04:58) [4]


> Compiler ©   (01.11.07 01:25) [3]
> Еще хороший способ.AnimateWindow(form.handle, 2000, AW_BLEND
> or AW_HIDE);

Да хотелось бы адаптировать [1], чтоб работало при закрытии формы. Не пойму почему форма чернеет при закрытии.


 
Дмитрий К ©   (2007-11-01 06:38) [5]

А если так:
 i := form.AlphaBlend - 1;
 while i > 0 do
 begin
   form.AlphaBlend := i;
   form.ProcessPaintMessages; // ProcessMessages;
   dec(i);
   {Sleep(10);}
 end;


 
Trible   (2007-11-01 10:51) [6]


> Дмитрий К ©   (01.11.07 06:38) [5]

Ну чернеет форма при закрытии, сами убедитесь ...


 
Compiler ©   (2007-11-01 11:55) [7]


> AnimateWindow(form.handle, 2000, AW_BLEND or AW_HIDE);

Так работает при закрытии!!!


 
Trible   (2007-11-01 12:00) [8]


> Compiler ©   (01.11.07 11:55) [7]
> > AnimateWindow(form.handle, 2000, AW_BLEND or AW_HIDE);
> Так работает при закрытии!!!

При закрытии работает, при открытии AnimateWindow() лажает (форма не перерисовываеццо). Писал AnimateWindow( form.Handle, 2000, AW_BLEND );


 
Compiler ©   (2007-11-01 12:18) [9]

procedure TForm1.KOLFormShow(Sender: PObj);
begin
AnimateWindow( form.Handle, 3000, AW_BLEND or AW_ACTIVATE );
end;


 
homm ©   (2007-11-01 12:21) [10]

> [8] Trible   (01.11.07 12:00)
> Писал AnimateWindow( form.Handle, 2000, AW_BLEND );

А писал form.CreateWindow; ?


 
Trible   (2007-11-01 13:31) [11]


> homm ©   (01.11.07 12:21) [10]
> > [8] Trible   (01.11.07 12:00)> Писал AnimateWindow( form.
> Handle, 2000, AW_BLEND );А писал form.CreateWindow; ?

Вообще, конструкция

procedure TForm1.KOLFormCreate(Sender: PObj);
begin
Form.CreateWindow;
AnimateWindow( Form.Handle, 1000, AW_BLEND );
end;

приводит к тому, что изменение блендинга при запуске не работает (форма прорисовывается мгновенно без блендинга). И вообще, я не уверен: в какой версии Виндовс появилась AnimateWindow() ? В 98 будет работать?

Подскажите, как победить почернение формы в [5], [2].


 
homm ©   (2007-11-01 13:36) [12]

> [11] Trible   (01.11.07 13:31)
> В 98 будет работать?

В 98-й ничего из предложеного не будет работать.
В 98-й можно только скриншот экрана сделать в том месте, где форма должна появится и скриншот формы (учитывая то, что тебе нужно это сделать ДО появления формы — чудо, если тебе это удастся) и медленно его перерисовывать с альфасмешиванием, использую, например функцию AlphaBlend из KOLGRushControls.pas.


 
homm ©   (2007-11-01 13:38) [13]

Общий совет: используй AnimateWindow и забей на 9х, на них сейчас седят только суровые парни, которым рюшечки не нужны.


 
homm ©   (2007-11-01 14:04) [14]

> [4] Trible   (01.11.07 04:58)
> Не пойму почему форма чернеет при закрытии.

Потому что она в это сремя рисуется в другой контекст, не на экрнан, как до этого, а в буфер видеопамяти. У любого, окна изменяющего свою прозрачность с полностью прозрачного есть такой переход, в любом приложенеии.

при использовании AnimateWindow не забудь сделать так, что-бы ее использование не приводило к невозможности запуска твоей проги на 9х. Как это сделать можно помотреть в коде реализации свойства AlphaBlend в самом КОЛ.


 
Compiler ©   (2007-11-03 00:55) [15]

Внедрил в свою прогу такой спецэффект. Как не странно, заработало как требуется, но только форма чернеет при минимизации и максимизации.

procedure TForm1.KOLFormFormCreate(Sender: PObj);
var
 i:integer;
begin
i:=0;
form.AlphaBlend:=i;
form.CreateWindow;
while i<>255 do
 begin
   Form1.form.AlphaBlend := i;
   Applet.ProcessMessages;
  inc(i);
 end;
end;

procedure TForm1.KOLFormClose(Sender: PObj; var Accept: Boolean);
var
 i:integer;
begin
i:=254;
while i<>0 do
 begin
   Form1.form.AlphaBlend := i;
   Applet.ProcessMessages;
  dec(i);
 end;
end;


 
homm ©   (2007-11-03 01:06) [16]

> [15] Compiler ©   (03.11.07 00:55)
> но только форма чернеет при минимизации и максимизации.

А прочитать то, что жо этого здесь я написал — лень?


 
Vladimir Kladov ©   (2007-11-03 06:38) [17]

По простому: чтобы не чернело, уберите с формы все Transparent и DoubleBuffered.


 
homm ©   (2007-11-03 07:42) [18]

> [17] Vladimir Kladov ©   (03.11.07 06:38)

Хм… нет. Я попробовал код из [15] на форме с прозрачностью, он работает. Причем на формах среднего размера все идеально, а на большой форме фотма белеет сразу после появления. Т.е. сначала ничего, потом четверть секунды белый прямоуольник, потом форма с прозрачностью 1/256.

Насчет AnimateWindow функции, может дело в этом?
If the function fails, the return value is zero. The function will fail in the following situations:
………
When trying to animate a child window with AW_BLEND.


 
Vladimir Kladov ©   (2007-11-03 10:19) [19]

Но у меня сработало. Причём после первого изменения альфы я возвращаю прозрачность, но уже ничего не чернеет. См. в зумере все самоисчезающие сообщения вроде того что это первая/последняя картинка в списке, Fit window включено/выключено и т.п. - в варианте с грашем. Если приглядеться, то даже видно, что при первом показе стиль отличается чуть-чуть. Но потом прозрачность меняется только до 254 чтобы перехода уже не было.


 
Trible   (2007-11-09 21:14) [20]


> Vladimir Kladov ©   (03.11.07 10:19) [19]
> Но у меня сработало.

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


 
homm ©   (2007-11-09 21:23) [21]

> [20] Trible   (09.11.07 21:14)
> а можно поподробнее? поясните на примере, как вы в зумере
> сделали прозрачность?

Включи монитор уже:

> [19] Vladimir Kladov ©   (03.11.07 10:19)
> Но потом прозрачность меняется только до 254 чтобы перехода
> уже не было.


 
arreke ©   (2008-02-13 06:57) [22]

Извиняюсь за глупый вопрос.
KOL и MCK, я так понял дополнительные библиотеки, и предыдущие посты написаны для них.
А возможно ли вышесказанные эффекты применить без использования этих библиотек ?
То есть FormCreate begin ... end; FormClose begin ... end;


 
=BuckLr= ©   (2008-02-13 11:01) [23]

Да. какая разница, всё равно api используется


 
Chandrasecar ©   (2008-02-13 18:46) [24]

Я нашел следующее решение проблемы, и оно на мой взгляд куда проще! Ведь не все имеют библиотеку компонентов KOL. Только прежде в св-вах формы нужно указать следующее: AlphaBlend:=True; AlphaBlendValue:=0. На форму добавить таймер, Interval:=1.

procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
  Form1.AlphaBlend:=True;
  for i:=0 to 255 do
  begin
     Form1.AlphaBlendValue:=i;
  end;
  Timer2.Enabled:=False;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var j:integer;
begin
  for j:=255 downto 0 do
  begin
     Form1.AlphaBlendValue:=j;
  end;
end;


 
Chandrasecar ©   (2008-02-13 18:51) [25]

Да, добавлю к предыдущему, процедура для Timer1 должна быть в самом начале програмного кода, т.е. должна выполняться первой! А значение Interval для Timer1 может быть в принципе любым! Оптимальное, на мой взгляд - 25.


 
arreke ©   (2008-02-13 22:29) [26]


> to Chandrasecar


зачем столько писать, выше Compiler уже писал же,
на FormCreate кидаем AnimateWindow(Form1.Handle, 1000, AW_BLEND or AW_ACTIVATE);
на FormClose кидаем AnimateWindow(Form1.handle, 1000, AW_BLEND or AW_HIDE);
и всё нормуль



Страницы: 1 вся ветка

Текущий архив: 2009.06.21;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.015 c
15-1239276494
Tenebrae
2009-04-09 15:28
2009.06.21
экспорт СМС


11-1201874936
Татьяна
2008-02-01 17:08
2009.06.21
программирование для КПК со сканером


11-1201782909
Elec3C
2008-01-31 15:35
2009.06.21
А баг всё равно есть


2-1240905683
Sowyer
2009-04-28 12:01
2009.06.21
Вопрос по Edit


13-1124000957
cherrex
2005-08-14 10:29
2009.06.21
COM и .NET