使用TFrame,如何正确访问TCanvas属性,就像在TForm中一样?

时间:2013-03-08 12:34:40

标签: delphi tframe

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

我已经通过覆盖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;

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

2 个答案:

答案 0 :(得分:5)

最简单的方法是

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;

答案 1 :(得分:2)

仅当帧具有子项时才调用帧的PaintWindow方法。你需要为你的框架或一些孩子(可能看不见)添加一个颜色框控件(或类似的)。