0

TMemo在我的 GUI 应用程序中左右移动一个对象。问题是,TMemo一旦运动开始,我的字母就会闪烁。

我已经查过了,显然,设置DoubleBuffering我的主窗体的属性应该对我有帮助,但它没有。所以我尝试在所有正在移动的对象上将该属性设置为 true,但仍然存在闪烁。

Lazarus中有没有什么方法可以实现GUI组件的无闪烁动画?我是拉撒路的新手,所以我现在有点盲目地搜索解决方案。我真的很感激一些帮助。

为了提供更多的上下文,这里是我如何为我的动画制作动画TMemo:我有TTimer一个间隔值为 10 的 a,它的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;
4

1 回答 1

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; 
于 2017-10-03T09:42:04.930 回答