Перейти к содержанию
Fire Monkey от А до Я
  • 0

Объектная модель примитивов


SergeyIT

Вопрос

Приветствую.

Речь пойдет о создании графики в коде.

Когда интересно вывести в TPanel "полноценный" управляемый графический объект, скажем, линию,

то мы должны поступать так:

line:= TLine.Create(pnlDrawing);
   line.StrokeThickness:= 10;
   line.LineType:= TLineType.Top;
   line.Position:= TPosition.Create(TPointF.Create(130, 130));
   line.RotationAngle:= 90;
   line.HitTest:= True;
   line.StrokeCap:= TStrokeCap.Round;
   line.Width:= 100;
   // line.Stroke:= не могу найти в доке правил описания кистей!
   line.Parent:= pnlDrawing;

где pnlDrawing - TPanel контейнер.

 

Однако же, если необходимо получить лишь визуальную - неуправляемую линию, на помощь приходит TCanvas (FM edition :)) как аналог графического контекста в других языках. И по установленным правилам мы помещаем вот такую часть в OnPaint обработчик контейнера рисования.

begin
with Canvas do
    if BeginScene then
    begin
        try
          Canvas.DrawLine(TPointF.Create(100, 100), TPointF.Create(100, 100), 0.5);
        finally
          Canvas.EndScene;
        end;
    end;
end;

Эксперименты показывают, что Canvas "помнит" размер пена (ручки), установленный как line.StrokeThickness:= 10;, например, в обработчике OnCreate панели или формы. Опыт показал также, что вызов OnPaint работает в стиле SMART - только при необходимости перерисовать панель. Скажеи, при изменении размеров формы.

 

Вопрос:

Линия, которая создается в Canvas.DrawLine(...) - это ведь всего лишь примитив в терминах DirectX, если мы говорим о Windows исполнении?

А вовсе не полноценный UI компонент TLine. Так?

Изменено пользователем SergeyIT
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Администраторы

Добрый вечер,

 

TLine- это компонент - контрол (TControl), который содержит:

  1. Свойства, описывающие характеристики рисуемой линии (цвет, толщина, способ заливки и тд)
  2. Код по установке этих параметров в Canvas и выполнению уже отрисовки самой линии при помощи функции Canvas.DrawLine.

Canvas.DrawLine под Windows, при использовании DirectX, выполняет отрисовку примитива через IASetPrimitiveTopology

Изменено пользователем Brovin Yaroslav
Ссылка на комментарий
  • 0

Браво FM Team!

Спасибо! Это гениально, говорю без лишнего пафоса. Искренне.

Могу пояснить мое восхищение, если это будет кому то интересно.

Изменено пользователем Brovin Yaroslav
Ссылка на комментарий
  • 0

Браво FM Team!

Спасибо! Это гениально, говорю без лишнего пафоса. Искренне.

Могу пояснить мое восхищение, если это будет кому то интересно.

Мне интересно "услышать" ваше пояснение. 

Ссылка на комментарий
  • 0

@zairkz

 

На работу FM вообще и, в частности, на работу 2D, очень интересно смотреть с позиций сравнения с WPF Microsoft и JavaFX Oracle. В первой у меня, не скрою, большой опыт. Но и со второй было общение. Существует 2 клиентских модели рисования: умная (по необходимости обновления экрана) и игровая в вечно бегущем OnPaint (OnDraw, ...). Далее, если я ошибусь, то меня поправит, надеюсь, Ярослав.
FM использует умную модель (как WPF и JavaFX) с тем, чтобы не нагружать процессор. Ну, в самом деле, клиентское приложение не игрушка и в FM team знают, когда надо перерисовать графику. В особых экстраординарных случаях есть спец. методы принудительной кастомной прорисовки. Но уж не знаю как в OP работал OnPaint раньше (я неделю назад влюбился в OP окончательно и бесповоротно), но возможность рисовать в OnPaint оставлена. Причем, вызов OnPaint работает по "умной" схеме (по необходимости) и второе, тяжелые компоненты (контролы по факту) не создаются, а вместо этого идет указание DirectX или OpenGL набросить легенький примитив, не отягощенный никакими атрибутами UI контрола и пр. Иначе, FM team оставила все возможности. Хочешь ловить события кликов по линии - пожалуйста, контрол TLine. Хочешь рисовать что-то в псевдоигровом стиле - Canvas.Draw...

 

В WPF также широко представлена объектная (UI компонентная) модель для рисования умных контролов типа линий, эллипсов и пр. Однако отсутствует такой вот изящный псевдоигровой OnPaint. А что же со свойствами графики, рисуемой TCanvas. Они работают так, как это было принято всюду ранее - графический контекст. Чуть выше канвас получает атрибуты пера, далее рисует что-то, далее опять можно изменить эти свойства и нарисовать что-то другое.

 

В общем, все очень красиво и элегантно. Когда познакомлюсь поближе, можно что-то и обзорное написать на эту тему.

Изменено пользователем SergeyIT
Ссылка на комментарий
  • 0
  • Модераторы

Все верно написали

 

Но уж не знаю как в OP работал OnPaint раньше

FMX устроена так что есть только один TCanvas он и отрисовывает всех своих дочек.

В VCL по другому каждый контрол отрисовывает себя сам

Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...