我正在尝试编写模拟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处理程序时,它没有。谁能告诉我我做错了什么?我正在使用德尔福柏林入门版。感谢
答案 0 :(得分:4)
必须使用OnPaint
事件绘制TPaintBox
。每次Windows需要您重绘控件时都会触发此事件。您不能随时绘制到控件的Canvas
,因为它将在下次重新绘制控件时绘制。
在您的特定情况下,您无需将整个代码块移动到OnPaint
事件处理程序。相反,您只需要:
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
PaintBox1.Canvas.Draw(0,0,buffer.Picture.Bitmap)
end;