我需要在運行時在畫布上繪製畫布,就像使用普通窗體一樣,但由於某些原因,他們決定不將畫布屬性添加到畫框,即使是TCustomFrame和TCustomForm都來自處理相同的父類帆布。使用TFrame,如何正確訪問TCanvas屬性,就像在TForm中一樣?
我已經將其工作到了可以通過重寫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方法? – 2013-03-08 13:01:11
@DavidHeffernan不,沒有實現它。 – Peter 2013-03-08 13:11:43