delphi - PaintTo 不适用于我的组件

标签 delphi

大家好 我创建了一个从 TWinControl 派生的新组件。 我将其放在 TPanel 上,并尝试调用面板的 PaintTo 过程。结果是面板及其标题,而我的组件根本没有绘制在 Canvas 上。我该怎么办?

部分来源(正如亲爱的大卫所问):

Procedure TApListBox.Paint;
var
  C: TCanvas;
  B: TBitmap;
  ItemClient: TPoint;
Begin
  Try
    If (FUpdating > 0) Then
      Exit;
    Try
      BeginUpdate;
      B := TBitmap.Create;
      B.Width := Width;
      B.Height := Height;
      With B.Canvas Do Begin
        Lock;
        // Begin :
        ItemClient := Point(IVisPanel + 3, 2);

        // Draw Items
        PaintItems(B.Canvas, ItemClient);
        Unlock;
      End;

      C := TCanvas.Create;
      C.Handle := GetWindowDC(Self.Handle);
      C.Lock;
      inherited;
      C.Draw(1, 1, B);
      If (RenameEdit.Visible) Then
        RenameEdit.Repaint;
    Finally
      C.Unlock;
      ReleaseDC(0, C.Handle);
      C.Free;
      B.Free;
      Dec(FUpdating);
    End;
  Except
  End;
End;

最佳答案

您确实不需要调用或重写 PaintTo。

相反,您应该使用重写的 Paint 方法完成 100% 的绘制。绘画可以随时发生,并且组件需要能够根据需要自行绘画。发生的方式是 Windows 发送一条 WM_PAINT 消息,VCL 将其转换为对组件 Paint 方法的调用。

因此,请确保您的组件可以随时绘制所需的内容,并在重写的 Paint 方法中完成所有绘制

关于delphi - PaintTo 不适用于我的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4696796/

相关文章:

image - 图像透明度

multithreading - TThread 在 Delphi 2006 控制台应用程序中的工作方式是否不同?

mysql - Delphi + Zeos 上的临时自动增量列,多个查询失败?

c++ - 扫描速度慢的内存扫描器

delphi - 利用编译器错误是一种好习惯吗?

delphi - 如何在 TCanvas 上绘制剖面线并指定背景颜色

Delphi:如何以请求的宽度和行数绘制一些文本,并以省略号结尾?

delphi - 如何让单个组件同时支持VCL和FMX?

Delphi FloatToStr - 为什么显示不同?

delphi - 如何在运行时创建TDataSet查找字段?