【问题标题】:Using TFrame, how do I properly access the TCanvas property just as in a TForm?使用 TFrame,我如何像在 TForm 中一样正确访问 TCanvas 属性?
【发布时间】:2013-02-24 00:05:13
【问题描述】:

我需要在运行时在框架 Canvas 上绘制,就像使用普通表单一样,但由于某种原因,他们决定不将 Canvas 属性添加到框架中,即使 TCustomFrame 和 TCustomForm 都来自同一个父类处理 Canvas。

我已经让它工作到我可以通过覆盖 PaintWindow 过程来绘制东西的部分,但我似乎仍然无法在运行时使用 Canvas 属性,就好像我错过了一大块代码一样。

这是我到目前为止所做的:

TCustomFrameEx = class(TCustomFrame)
  private
    FCanvas: TControlCanvas;
    function GetCanvas: TCanvas;
  public
  property Canvas: TCanvas read GetCanvas;
end;

TFrame = class(TCustomFrameEx)
  protected
    procedure PaintWindow(DC: HDC); override;        
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy(); override;
  published
    ...
  end;

constructor TFrame.Create(AOwner: TComponent);
begin
  inherited;
  FCanvas := TControlCanvas.Create();
end;

destructor TFrame.Destroy();
begin
  FreeAndNil(fCanvas);
  inherited;
end;

function TCustomFrameEx.GetCanvas : TCanvas;
begin
  Result := fCanvas;
end;

procedure TFrame.PaintWindow(DC: HDC);
begin
  inherited;
  FCanvas.Handle := DC;
  FCanvas.Control := Self;
  FCanvas.Brush.Color := clWhite;
  fCanvas.FillRect(GetClientRect);
  FCanvas.Handle := 0;
end;

我认为我没有正确分配句柄或缺少一些绘画事件?

【问题讨论】:

  • TFrame没有Paint方法吗?
  • @DavidHeffernan 不,没有它的实现。

标签: delphi tframe


【解决方案1】:

框架的PaintWindow 方法只有在框架有子框架时才会被调用。您需要向您的框架或一些子项(可能是不可见的)添加一个油漆框控件(或类似控件)。

【讨论】:

    【解决方案2】:

    最简单的方法是

    procedure TFrame2.PaintWindow(DC: HDC);
    Var
     c:TCanvas;
    begin
      inherited;
      c := Tcanvas.Create;
      try
       c.Handle := DC;
       c.Brush.Color := clWhite;
       c.FillRect(GetClientRect);
       c.Brush.Color := clBlue;
       //c.Ellipse(0,0,200,200);
      finally
       c.Free;
      end;
    end;
    

    【讨论】:

    • 如果你必须在它周围有一个 TFrame,那就使用一个 TPaintBox,很好。不过,您为什么要这样做,我无法理解。
    • @WarrenP 我知道 PaintBox 会更有意义
    猜你喜欢
    • 2010-11-29
    • 2020-01-01
    • 1970-01-01
    • 2020-06-26
    • 2021-10-20
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多