Canvas 查皮拉撒路,什么也没有

Canvas 查皮拉撒路,什么也没有,canvas,drawing,shape,lazarus,Canvas,Drawing,Shape,Lazarus,我试图通过画布在一个T形状上画画,但是,没有任何显示 procedure TController.DrawGrind; begin ShowMessage('I try do draw something'); with FView.Shape1 do begin Canvas.MoveTo(Left, Top); Canvas.Pen.Width:= 5; Canvas.Pen.Style := psSolid; Canvas.Pen.Color:

我试图通过画布在一个T形状上画画,但是,没有任何显示

procedure TController.DrawGrind;
begin
  ShowMessage('I try do draw something');

  with FView.Shape1 do
  begin
    Canvas.MoveTo(Left, Top);
    Canvas.Pen.Width:= 5;
    Canvas.Pen.Style := psSolid;
    Canvas.Pen.Color:= clRed;
    Canvas.Brush.Color:= clRed;
    Canvas.LineTo(Left, Width);
  end;

  FView.Shape1.Refresh;

end;        

感谢阅读

这是因为您正在调用
刷新
方法。此方法立即强制控件重新绘制。改为使用
OnPaint
事件方法绘制绘图,并仅调用该形状对象上的
刷新
无效
,以强制其触发
OnPaint
事件:

procedure TController.DrawGrind;
begin
  ShowMessage('I try do draw something');
  // if you use Refresh instead of Invalidate, the control will be forced
  // to repaint itself immediately
  FView.Shape1.Invalidate;
end;

procedure TForm1.Shape1Paint(Sender: TObject);
begin
  Shape1.Canvas.Pen.Width := 5;
  Shape1.Canvas.Pen.Color := clRed;
  Shape1.Canvas.Pen.Style := psSolid;
  Shape1.Canvas.MoveTo(0, 0);
  Shape1.Canvas.LineTo(Shape1.ClientWidth, Shape1.ClientHeight);
end;

在您的原始代码中,您还试图利用非常奇怪的位置。画布坐标从
[0;0]
开始,转到
[Control.ClientWidth;Control.ClientHeight]

查看更新。你看不到任何东西,很可能是因为你在画形状相对于其父形状的相对位置的坐标。画布坐标从
[0;0]
[Control.ClientWidth;Control.ClientHeight]
开始。