我需要在运行时绘制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;
我认为我没有正确分配句柄或错过一些绘画事件?
答案 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
方法。你需要为你的框架或一些孩子(可能看不见)添加一个颜色框控件(或类似的)。