Используя TFrame, как мне правильно получить доступ к свойству TCanvas, как в TForm?
Мне нужно рисовать на фреймах Canvas во время выполнения так же, как вы делаете это с обычной формой, но по какой-то причине они решили не добавлять свойство Canvas в фрейм, даже если TCustomFrame и TCustomForm происходят из одного и того же родительского класса, который обрабатывает Canvas,
Я заставил его работать до той части, где я могу что-то нарисовать, переопределив процедуру 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 ответа
Самый простой способ был бы
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;
PaintWindow
метод фрейма вызывается только если у фрейма есть дочерние элементы. Вам нужно будет добавить элемент управления (или аналогичный элемент) в рамку или несколько дочерних элементов (возможно, невидимых).