无法写入表单的画布

Ess*_*PAL 0 delphi canvas

我正在创建一个表格,并想在画布上画画,但我无法这样做.没有输出就没有错误.

这是简单的测试代码

procedure TForm11.Button1Click(Sender: TObject);
var
  Fm: TForm;
  R: TRect;
begin
  try
    Fm := TForm.Create(nil);
    Fm.Position := poScreenCenter;
    Fm.Caption := 'Test';
    Fm.Width := 600;
    Fm.Height := 400;
    Fm.Color := clGreen;

    Fm.Canvas.Font.Color := clBlack;
    Fm.Canvas.Font.Size := 12;
    Fm.Canvas.Pen.Color := clBlack;
    Fm.Canvas.Pen.Width := 5;
    Fm.Canvas.Brush.Color := clRed;;
    Fm.Canvas.Brush.Style := bsSolid;

    R.Left := 10;
    R.Top := 10;
    R.Width := 100;
    R.Height := 100;

    Fm.Canvas.TextOut(200, 10, 'Hello');
    Fm.Canvas.Rectangle(R);

    Fm.ShowModal;
  finally
    Fm.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

Gol*_*rol 6

单击控件时,画布会一直重新绘制,移动表单.在您的情况下,您绘制图像,但在此之后,表单将显示,它将(重新)绘制自己,覆盖您的绘图.为了保留你的绘图,你可以OnPaint在表单的情况下绘制它,每次表单需要重绘自己时都会调用它.

procedure TForm11.Button1Click(Sender: TObject);
var
  Fm: TForm;
begin
  Fm := TForm.Create(nil);
  try
    Fm.Position := poScreenCenter;
    Fm.Caption := 'Test';
    Fm.Width := 600;
    Fm.Height := 400;
    Fm.Color := clGreen;
    Fm.OnPaint := MyFormPaint;

    Fm.ShowModal;
  finally
    Fm.Free;
  end;
end;

procedure TForm11.MyFormPaint(Sender: TObject);
var
  Fm: TForm;
  R: TRect;
begin
  FM := TForm(Sender);

  Fm.Canvas.Font.Color := clBlack;
  Fm.Canvas.Font.Size := 12;
  Fm.Canvas.Pen.Color := clBlack;
  Fm.Canvas.Pen.Width := 5;
  Fm.Canvas.Brush.Color := clRed;;
  Fm.Canvas.Brush.Style := bsSolid;

  R.Left := 10;
  R.Top := 10;
  R.Width := 100;
  R.Height := 100;

  Fm.Canvas.TextOut(200, 10, 'Hello');
  Fm.Canvas.Rectangle(R);
end;
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是在Bitmap的画布上绘制它,将该位图分配给TImage的Picture属性,并在窗体上显示TImage.然后,每当表单需要重新绘制时,它都会让每个控件重绘自己,并且图像将重绘位图,因此它仍然可见.

procedure TForm11.Button1Click(Sender: TObject);
var
  Fm: TForm;
  Img: TImage;
  B: TBitmap;
  R: TRect;
begin
  Fm := TForm.Create(nil);
  try
    Fm.Position := poScreenCenter;
    Fm.Caption := 'Test';
    Fm.Width := 600;
    Fm.Height := 400;

    // Add an image. Make the form the owner. That way, it is automatically 
    // discarded when you free the form in the `finally` block.
    Img := TImage.Create(Fm);

    // Make the form the parent too, and make sure the image covers the form.
    Img.Parent := Fm;
    Img.Align := alClient;

    // Get bitmap of the picture. This will automatically create
    // a bitmap for it too, which is managed by the image.
    // You just have to give it the right dimensions.
    B := Img.Picture.Bitmap;
    B.Width := Fm.ClientWidth;
    B.Height := Fm.ClientHeight;

    // The image is not transparent, so you'll have to draw the green background too.
    B.Canvas.Brush.Color := clGreen;
    B.Canvas.FillRect(B.Canvas.ClipRect);

    // Draw on the canvas of the bitmap.
    B.Canvas.Font.Color := clBlack;
    B.Canvas.Font.Size := 12;
    B.Canvas.Pen.Color := clBlack;
    B.Canvas.Pen.Width := 5;
    B.Canvas.Brush.Color := clRed;;
    B.Canvas.Brush.Style := bsSolid;

    R.Left := 10;
    R.Top := 10;
    R.Width := 100;
    R.Height := 100;

    B.Canvas.TextOut(200, 10, 'Hello');
    B.Canvas.Rectangle(R);

    Fm.ShowModal;
  finally
    Fm.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

  • @EssexPAL 你不认为这个答案应该被接受吗?(在此处阅读更多信息:[当有人回答我的问题时我该怎么办](http://stackoverflow.com/help/someone-answers)) (2认同)