Конференция "KOL" » Анимация окна [Delphi, Windows]
 
  • Trible (31.10.07 05:24) [0]
    Как сделать в КОЛ, чтобы при запуске приложения происходил эффект анимации главного окна - прозрачность плавно изменялась от полупрозрачного до непрозрачного?
  • Compiler © (31.10.07 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 (31.10.07 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 © (01.11.07 01:25) [3]
    Еще хороший способ.
    AnimateWindow(form.handle, 2000, AW_BLEND or AW_HIDE);

  • Trible (01.11.07 04:58) [4]

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

    Да хотелось бы адаптировать [1], чтоб работало при закрытии формы. Не пойму почему форма чернеет при закрытии.
  • Дмитрий К © (01.11.07 06:38) [5]
    А если так:
     i := form.AlphaBlend - 1;
     while i > 0 do
     begin
       form.AlphaBlend := i;
       form.ProcessPaintMessages; // ProcessMessages;
       dec(i);
       {Sleep(10);}
     end;

  • Trible (01.11.07 10:51) [6]

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

    Ну чернеет форма при закрытии, сами убедитесь ...
  • Compiler © (01.11.07 11:55) [7]

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

    Так работает при закрытии!!!
  • Trible (01.11.07 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 © (01.11.07 12:18) [9]
    procedure TForm1.KOLFormShow(Sender: PObj);
    begin
    AnimateWindow( form.Handle, 3000, AW_BLEND or AW_ACTIVATE );
    end;

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

    А писал form.CreateWindow; ?
  • Trible (01.11.07 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 © (01.11.07 13:36) [12]
    > [11] Trible   (01.11.07 13:31)
    > В 98 будет работать?

    В 98-й ничего из предложеного не будет работать.
    В 98-й можно только скриншот экрана сделать в том месте, где форма должна появится и скриншот формы (учитывая то, что тебе нужно это сделать ДО появления формы — чудо, если тебе это удастся) и медленно его перерисовывать с альфасмешиванием, использую, например функцию AlphaBlend из KOLGRushControls.pas.
  • homm © (01.11.07 13:38) [13]
    Общий совет: используй AnimateWindow и забей на 9х, на них сейчас седят только суровые парни, которым рюшечки не нужны.
  • homm © (01.11.07 14:04) [14]
    > [4] Trible   (01.11.07 04:58)
    > Не пойму почему форма чернеет при закрытии.

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

    при использовании AnimateWindow не забудь сделать так, что-бы ее использование не приводило к невозможности запуска твоей проги на 9х. Как это сделать можно помотреть в коде реализации свойства AlphaBlend в самом КОЛ.
  • Compiler © (03.11.07 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 © (03.11.07 01:06) [16]
    > [15] Compiler ©   (03.11.07 00:55)
    > но только форма чернеет при минимизации и максимизации.

    А прочитать то, что жо этого здесь я написал — лень?
  • Vladimir Kladov © (03.11.07 06:38) [17]
    По простому: чтобы не чернело, уберите с формы все Transparent и DoubleBuffered.
  • homm © (03.11.07 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 © (03.11.07 10:19) [19]
    Но у меня сработало. Причём после первого изменения альфы я возвращаю прозрачность, но уже ничего не чернеет. См. в зумере все самоисчезающие сообщения вроде того что это первая/последняя картинка в списке, Fit window включено/выключено и т.п. - в варианте с грашем. Если приглядеться, то даже видно, что при первом показе стиль отличается чуть-чуть. Но потом прозрачность меняется только до 254 чтобы перехода уже не было.
  • Trible (09.11.07 21:14) [20]

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

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

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

    > [19] Vladimir Kladov ©   (03.11.07 10:19)
    > Но потом прозрачность меняется только до 254 чтобы перехода
    > уже не было.
  • arreke © (13.02.08 06:57) [22]
    Извиняюсь за глупый вопрос.
    KOL и MCK, я так понял дополнительные библиотеки, и предыдущие посты написаны для них.
    А возможно ли вышесказанные эффекты применить без использования этих библиотек ?
    То есть FormCreate begin ... end; FormClose begin ... end;
  • =BuckLr= © (13.02.08 11:01) [23]
    Да. какая разница, всё равно api используется
  • Chandrasecar © (13.02.08 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 © (13.02.08 18:51) [25]
    Да, добавлю к предыдущему, процедура для Timer1 должна быть в самом начале програмного кода, т.е. должна выполняться первой! А значение Interval для Timer1 может быть в принципе любым! Оптимальное, на мой взгляд - 25.
  • arreke © (13.02.08 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);
    и всё нормуль
 
Конференция "KOL" » Анимация окна [Delphi, Windows]
Есть новые Нет новых   [134431   +15][b:0.001][p:0.002]