2017-10-02 18 views
0

GUI 응용 프로그램에서 TMemo 개체를 좌우로 움직이고 있습니다. 문제는, 움직임이 시작하자마자 내 TMemo의 문자가 깜박 거린다는 것입니다.나사로 GUI 구성 요소에 애니메이션을 적용 할 때 깜박임을 피하는 방법

나는 이걸 보았고, 내 양식의 DoubleBuffering 속성을 설정하면 도움이 될 것 같았지만 그렇지 않았다. 그래서 움직이는 모든 물체에서이 속성을 true로 설정하려고 시도했지만 깜박임이 여전히있었습니다.

Lazarus에서 GUI 구성 요소의 깜박임없는 애니메이션을 만들 수있는 방법이 있습니까? 저는 나사로의 초심자입니다. 그래서 저는 지금 맹목적으로 해결책을 찾기 위해 일종의 인터넷 검색을하고 있습니다. 나는 정말로 약간의 도움에 감사 할 것이다.

는 여기에 내가 애니메이션 방법, 더 컨텍스트를 제공하기 위해 내 TMemo : 나는 10의 간격 값으로 TTimer있어, 그 OnTimer 이벤트 내 TMemo이 바로 인접 왼쪽으로 이동합니다. 움직임을 부드럽게하기 위해 간단한 코사인 보간 함수를 추가했습니다.

procedure TServerSideForm.ControlPanelHideTimerTimer(Sender: TObject); 
begin 
    if (hideAnimVal < 1) then 
    begin 
    hideAnimVal := hideAnimVal + 0.025; 
    end 
    else 
    begin 
    MemoHideTimer.Enabled:=false; 
    end; 


    // hideStart - starting position of my TMemo, hideEnd - end position of my TMemo 
    hideCurr := Round(CosineInterpolation(hideStart, hideEnd, hideAnimVal)); 

    Memo.Left:=hideCurr; 
end; 

코사인 보간 :

function CosineInterpolation(Val1, Val2, Angle: Double): Double; 
var 
    Percent: Double; 
begin 
    Percent := (1-Cos(Angle*PI))/2; 
    Result := (Val1 * (1 - Percent) + Val2 * Percent); 
end; 

답변

0

내가 대신 이미지를 이동하려고합니다 :

var 
    Memo1dc: hdc; 
    Cnv: TCanvas; 
    Rct: TRect; 

implementation 

procedure TForm1.MemoHideTimerTimer(Sender: TObject); 
begin 
    if Memo1.Visible then 
    begin 
    Memo1dc := GetDC(Memo1.Handle); 
    Cnv.Handle := Memo1dc; 
    Rct.Height := Memo1.Height; 
    Rct.Width := Memo1.Width; 
    Image1.Left := Memo1.Left; 
    Image1.Top := Memo1.Top; 
    Image1.Width := Memo1.Width; 
    Image1.Height := Memo1.Height; 
    Image1.Canvas.CopyRect(Rct, Cnv, Rct); 
    Memo1.Visible := False; 
    Image1.Visible := True; 
    end; 
    if (hideAnimVal < 1) then 
    begin 
    hideAnimVal := hideAnimVal + 0.025; 
    end 
    else 
    begin 
    MemoHideTimer.Enabled := False; 
    end; 

    // hideStart - starting position of my TMemo, hideEnd - end position of my TMemo 
    hideCurr := Round(CosineInterpolation(hideStart, hideEnd, hideAnimVal)); 
    Image1.Left := hideCurr; 
    if MemoHideTimer.Enabled = False then 
    begin 
    Memo1.Left := Image1.Left; 
    Memo1.Visible := True; 
    Image1.Visible := False; 
    end; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    Cnv := TCanvas.Create; 
end; 
여기 결국

코드입니다