-
Как сделать в КОЛ, чтобы при запуске приложения происходил эффект анимации главного окна - прозрачность плавно изменялась от полупрозрачного до непрозрачного?
-
Сойдет?
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;
-
> 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;
Так вот, при закрытии форма почему-то чернеет на секунду, а потом уже идет анимация (изменение аьфа-бленда). Как побороть?
-
Еще хороший способ. AnimateWindow(form.handle, 2000, AW_BLEND or AW_HIDE);
-
> Compiler © (01.11.07 01:25) [3] > Еще хороший способ.AnimateWindow(form.handle, 2000, AW_BLEND > or AW_HIDE);
Да хотелось бы адаптировать [1], чтоб работало при закрытии формы. Не пойму почему форма чернеет при закрытии.
-
А если так: i := form.AlphaBlend - 1;
while i > 0 do
begin
form.AlphaBlend := i;
form.ProcessPaintMessages; dec(i);
end;
-
> Дмитрий К © (01.11.07 06:38) [5]
Ну чернеет форма при закрытии, сами убедитесь ...
-
> AnimateWindow(form.handle, 2000, AW_BLEND or AW_HIDE);
Так работает при закрытии!!!
-
> Compiler © (01.11.07 11:55) [7] > > AnimateWindow(form.handle, 2000, AW_BLEND or AW_HIDE); > Так работает при закрытии!!!
При закрытии работает, при открытии AnimateWindow() лажает (форма не перерисовываеццо). Писал AnimateWindow( form.Handle, 2000, AW_BLEND );
-
procedure TForm1.KOLFormShow(Sender: PObj);
begin
AnimateWindow( form.Handle, 3000, AW_BLEND or AW_ACTIVATE );
end;
-
> [8] Trible (01.11.07 12:00) > Писал AnimateWindow( form.Handle, 2000, AW_BLEND );
А писал form.CreateWindow; ?
-
> 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].
-
> [11] Trible (01.11.07 13:31) > В 98 будет работать?
В 98-й ничего из предложеного не будет работать. В 98-й можно только скриншот экрана сделать в том месте, где форма должна появится и скриншот формы (учитывая то, что тебе нужно это сделать ДО появления формы — чудо, если тебе это удастся) и медленно его перерисовывать с альфасмешиванием, использую, например функцию AlphaBlend из KOLGRushControls.pas.
-
Общий совет: используй AnimateWindow и забей на 9х, на них сейчас седят только суровые парни, которым рюшечки не нужны.
-
> [4] Trible (01.11.07 04:58) > Не пойму почему форма чернеет при закрытии.
Потому что она в это сремя рисуется в другой контекст, не на экрнан, как до этого, а в буфер видеопамяти. У любого, окна изменяющего свою прозрачность с полностью прозрачного есть такой переход, в любом приложенеии.
при использовании AnimateWindow не забудь сделать так, что-бы ее использование не приводило к невозможности запуска твоей проги на 9х. Как это сделать можно помотреть в коде реализации свойства AlphaBlend в самом КОЛ.
-
Внедрил в свою прогу такой спецэффект. Как не странно, заработало как требуется, но только форма чернеет при минимизации и максимизации.
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;
-
> [15] Compiler © (03.11.07 00:55) > но только форма чернеет при минимизации и максимизации.
А прочитать то, что жо этого здесь я написал — лень?
-
По простому: чтобы не чернело, уберите с формы все Transparent и DoubleBuffered.
-
> [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.
-
Но у меня сработало. Причём после первого изменения альфы я возвращаю прозрачность, но уже ничего не чернеет. См. в зумере все самоисчезающие сообщения вроде того что это первая/последняя картинка в списке, Fit window включено/выключено и т.п. - в варианте с грашем. Если приглядеться, то даже видно, что при первом показе стиль отличается чуть-чуть. Но потом прозрачность меняется только до 254 чтобы перехода уже не было.
-
> Vladimir Kladov © (03.11.07 10:19) [19] > Но у меня сработало.
а можно поподробнее? поясните на примере, как вы в зумере сделали прозрачность?
-
> [20] Trible (09.11.07 21:14) > а можно поподробнее? поясните на примере, как вы в зумере > сделали прозрачность?
Включи монитор уже:
> [19] Vladimir Kladov © (03.11.07 10:19) > Но потом прозрачность меняется только до 254 чтобы перехода > уже не было.
-
Извиняюсь за глупый вопрос. KOL и MCK, я так понял дополнительные библиотеки, и предыдущие посты написаны для них. А возможно ли вышесказанные эффекты применить без использования этих библиотек ? То есть FormCreate begin ... end; FormClose begin ... end;
-
Да. какая разница, всё равно api используется
-
Я нашел следующее решение проблемы, и оно на мой взгляд куда проще! Ведь не все имеют библиотеку компонентов 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;
-
Да, добавлю к предыдущему, процедура для Timer1 должна быть в самом начале програмного кода, т.е. должна выполняться первой! А значение Interval для Timer1 может быть в принципе любым! Оптимальное, на мой взгляд - 25.
-
> to Chandrasecar
зачем столько писать, выше Compiler уже писал же, на FormCreate кидаем AnimateWindow(Form1.Handle, 1000, AW_BLEND or AW_ACTIVATE); на FormClose кидаем AnimateWindow(Form1.handle, 1000, AW_BLEND or AW_HIDE); и всё нормуль
|