为什么在激活表单时我的paintbox图像不会出现

时间:2017-03-29 17:00:25

标签: delphi

我正在尝试编写模拟VU表。我使用VU表的位图并将针绘制到位图上。我正在使用轨道栏,它是onChange事件来测试仪表:

procedure TForm1.TrackBar1Change(Sender: TObject);
var
  angle : integer;
  x,y : integer;
  Peaked : boolean;
begin
   Angle := 120 - Round(sTrackBar1.Position / sTrackBar1.Max * 100 )+20;
   Peaked := Angle < PeakVol;
   if Peaked then
    Buffer.Picture := VUImagePeaked.Picture
   else
    buffer.picture := VUImage.Picture;
   buffer.Picture.Bitmap.Canvas.Pen.Color := clSilver;
   buffer.Picture.Bitmap.Canvas.Pen.Width:=2;
   buffer.Canvas.MoveTo(pivot.x,Pivot.y);
   x := 150 + Round(Cos(DegToRad(Angle)) * NeedleLen);
   y := PaintBox1.Height - Round(Sin(DegToRad(Angle)) *NeedleLen);
   buffer.Canvas.LineTo(x,y);
   PaintBox1.Canvas.Draw(0,0,buffer.Picture.Bitmap)
end;

似乎工作但我得不到的是在程序启动时显示仪表的位图。我甚至使用上面的代码复制到Form.Create和Form.Activate事件处理程序,但没有乐趣。我创建了一个按钮并添加了以下代码来触发轨迹栏的onChange事件处理程序。这可以工作并显示仪表。

procedure TForm1.Button1Click(Sender: TObject);
begin
  TrackBar1.Position := 1;
end;

当我将其复制到Form.Activate处理程序时,它没有。谁能告诉我我做错了什么?我正在使用德尔福柏林入门版。感谢

1 个答案:

答案 0 :(得分:4)

必须使用OnPaint事件绘制TPaintBox。每次Windows需要您重绘控件时都会触发此事件。您不能随时绘制到控件的Canvas,因为它将在下次重新绘制控件时绘制。

在您的特定情况下,您无需将整个代码块移动到OnPaint事件处理程序。相反,您只需要:

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  PaintBox1.Canvas.Draw(0,0,buffer.Picture.Bitmap)
end;