Используя 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 метод фрейма вызывается только если у фрейма есть дочерние элементы. Вам нужно будет добавить элемент управления (или аналогичный элемент) в рамку или несколько дочерних элементов (возможно, невидимых).

Другие вопросы по тегам