2013-03-08 2 views
-3

Мне нужно нарисовать рамки Canvas во время выполнения так же, как вы делали бы с нормальной формой, но по какой-то причине они решили не добавлять свойство Canvas в фрейм, даже как 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? –

+0

@DavidHeffernan Нет, его реализация не существует. – Peter

ответ

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 вокруг него, отлично. Но почему бы вам не хотелось этого делать? –

+0

@WarrenP Я знаю, что PaintBox будет иметь больше смысла – Peter

2

PaintWindow метод кадра вызывается только если кадр имеет детей. Вам нужно будет добавить элемент управления краской (или аналогичный) к вашему фрейму или некоторым детям (возможно, невидимым).

 Смежные вопросы

  • Нет связанных вопросов^_^