Конференция "KOL" » Form.AlphaBlend и KOL в Delphi 4 [Delphi, Windows]
 
  • Сашик (29.06.08 18:57) [0]
    Предлагаю класс для работы с AlphaBlend KOL-формы. При закрытии KOL-формы при применении свойства AlphaBlend происходит мигание формы. Я так нигде и не нашел определенного ответа, как этого избежать (например диспут на форуме от 31.10.07). Пришлось практически переписать процедуру из KOL, а именно:

    unit NFormABlend;

    interface

    uses KOL, Windows;

    type
     TSetLayeredWindowAttributes=
       function( hwnd: Integer; crKey: TColor; bAlpha: Byte; dwFlags: DWORD )
       : Boolean; stdcall;

    PTimerAlphaBlend = ^TNTimerAlphaBlend;
    TNTimerAlphaBlend = object(TTimer)
     procedure TimerShowAction(Sender: pObj);
     procedure TimerHideAction(Sender: pObj);
    public
     Step,
     Alpha: Integer;
     Form: PControl;
       destructor Destroy; virtual;
       procedure SetAlpha(const Value: Byte);
       procedure Execute;
    end;

    procedure NewTimerAB(pForm: PControl; aInterval, aStep: Integer; aShow: Boolean);

    var
     SetLayeredWindowAttributes: TSetLayeredWindowAttributes;
     User32: THandle;

    implementation

    procedure NewTimerAB(pForm: PControl; aInterval, aStep: Integer; aShow: Boolean);
    var P: PTimerAlphaBlend;
    begin
     New(P, Create);
       with P^ do begin
        Form:= pForm;
                  Interval:= aInterval;
        if Ashow then begin
         Alpha:= 0;
          OnTimer:= TimerShowAction;
        end else begin
          Alpha:= 255;
         OnTimer:= TimerHideAction;
        end;
        SetAlpha(Alpha);
      Step:= aStep;
        Execute;
       end;
    end;

    { TNTimerAlphaBlend }

    destructor TNTimerAlphaBlend.Destroy;
    begin
       Form:= nil;
      inherited;
    end;

    procedure TNTimerAlphaBlend.Execute;
    begin
       Enabled:= True;
      while Alpha > 0 do Applet.ProcessMessages;
    end;

    procedure TNTimerAlphaBlend.SetAlpha(const Value: Byte);
     const WS_EX_LAYERED=$00080000;
     LWA_ALPHA      = $00000002;
     var dw: DWORD;
     begin
      if Assigned(SetLayeredWindowAttributes ) then begin
         dw:= GetWindowLong(Form.Handle, GWL_EXSTYLE );
         SetWindowLong(Form.Handle, GWL_EXSTYLE, dw or WS_EX_LAYERED );
         SetLayeredWindowAttributes(Form.Handle, 0, Value and $FF, LWA_ALPHA);
       end;
    end;

    procedure TNTimerAlphaBlend.TimerHideAction(Sender: pObj);
    begin
     dec(Alpha, Step);
     if (Alpha > 0) then SetAlpha(Alpha) else Free;
    end;

    procedure TNTimerAlphaBlend.TimerShowAction(Sender: pObj);
    begin
      inc(Alpha, Step);
     if Alpha > 254 then begin
      SetAlpha(255);
      Free;
     end else SetAlpha(Alpha);
    end;

    initialization
     User32:= GetModuleHandle('User32');
     SetLayeredWindowAttributes:= GetProcAddress(User32, 'SetLayeredWindowAttributes');

    end.


    Применять: NewTimerAB(Form, 10, 15, True)  при Form.OnShow и NewTimerAB(Form, 10, 15, False) при Form.OnClose
    Это у меня работает везде и всегда...
    Вопрос: неужели нельзя короче?
 
Конференция "KOL" » Form.AlphaBlend и KOL в Delphi 4 [Delphi, Windows]
Есть новые Нет новых   [134431   +15][b:0][p:0.003]