2013-03-08 61 views
-3

我需要在運行時在畫布上繪製畫布,就像使用普通窗體一樣,但由於某些原因,他們決定不將畫布屬性添加到畫框,即使是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; 

我認爲我沒有正確分配手柄或缺少一些油漆的事件?

+1

TFrame是否有Paint方法? – 2013-03-08 13:01:11

+0

@DavidHeffernan不,沒有實現它。 – Peter 2013-03-08 13:11:43

回答

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; 
+0

然後使用一個TPaintBox,如果你必須有一個TFrame,很好。但爲什麼你想這樣做超出了我的想法。 – 2013-03-08 13:19:43

+0

@WarrenP我知道一個PaintBox會更有意義 – Peter 2013-03-08 13:26:21

2

幀的PaintWindow方法如果框架有孩子,纔會調用。你需要添加一個油漆盒控件(或類似的)到你的框架,或一些兒童(也許不可見)。

相關問題