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

Как правильно рисовать на канве?


PFC

Вопрос

Исходно пытался нарисовать битмап на канве формы. Затем пытался нарисовать хоть что-нибудь. Все время получаю пустой экран. При этом аналогично ничего не получается и с TImage и с PaintBox. Проект на С++, Embarcadero XE7. Что я делаю не так?

SolverMXE7.zip

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

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

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

В FireMonkey в отличии от VCL нельзя рисовать на канве формы в произвольном месте. Рисование должно выполняться в отведенных местах: OnPaint, Paint, Painting

Всю отрисовку на канве формы нужно выполнять в событии OnPaint.

 

В вашем случае, вам нужно рисовать в TForm.OnPaint. А в событии таймера выполнять вызов Repaint.

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

Спсибо за ответ. Через OnPaint действительно работает. Однако у меня пиявилось еще несколько вопросов:

 

  1. В интернете много примеров, когда рисование все же идет по нажатию кнопки. Вот например: http://docwiki.embarcadero.com/CodeExamples/XE6/en/FMXTCanvasDrawFunctions_(Delphi) (этот примечателен еще и тем, что он от самой Embarcadero) Я вижу что он для XE6, в XE7 что-то изменилось (я уже заметил, что BitmapChanged стал приватным) ? Возможно ли как-то обойти ограничение на рисование только в OnPaint?
  2. У TImage и PaintBox действительно есть метод Repaint, а вот у  формы такого метода нет. Что лучше использовать если я таки хочу рисовать на форме?
Ссылка на комментарий
  • 0
  • Администраторы

На счет примера на DocWiki. Обратите внимание, что там идет отрисовка на канве TBitmap, а не на канве формы. На канве TBItmap можно рисовать из любого места. Главное помнить, что процесс рисования на канве в FireMonkey имеет три фазы:

  1. BeginScene - начало отрисовки
  2. Любая отрисовка на TCanvas
  3. EndScene - окончание рисования.

На счет формы, вместо Repaint у формы есть метод Invalidate.

Чтобы выполнить отрисовку в любом другом месте, можно сделать дополнительный буфер в виде TBitmap. И выполнять в любом месте отрисовку там. А в OnPaint у формы просто выводить сформированное изображение из TBitmap.

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

Отключить нет. Форма сама определяет при помощи контролов, какие области формы нужно перерисовать. Поэтому, если нужно добиться такого эффекта, то лучше использовать опять же временный буфер. И в нем делать наложение своей картинки на старую.

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

пытаюсь в приложении для Android просто вывести хоть какое-то изображение, но ничего не выходит. Делаю так в событии формы OnPaint:

 

      if Canvas.BeginScene then
      try
      Canvas.DrawLine(form1.ClientRect.TopLeft,form1.ClientRect.BottomRight,1);
      Canvas.DrawEllipse(Rectf(0,0,50,50),1);
      finally
      Canvas.EndScene;
      end;

 

Но выходит просто черный экран и все. Если убрать прорисовку эллипса, то риуется просто белый екран. Вообще для игры нужно вывести битмап на форму, но даже такие примитивы не выходит вывести. не могу понять почему? Больше никакого кода в проекте нет.

 

Если без этого кода просто на форму накидать компонентов imagecontrol и загрузить вних изображения, то их видно в приложении.

 

И еще вопрос. Вы ранее написали, что

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

И еще вопрос. Вы ранее написали, что можно в таймере вызывать Repaint; Но такого свойства в форме нет и в ее канве, по крайней мере RadStudio XE6 не предлагает такого варианта.

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

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

  1. В обработчике события OnPaint не нужно вызывать BeginUpdate/EndUpdate.
  2. Вместо Repaint у формы есть Invalidate.
Ссылка на комментарий
  • 0

Добрый день!

Есть такая ситуация, если рисовать часто в цикле и большое изображение например на Timage, например так

 

ImageDraw.Bitmap.Canvas.BeginScene();
ImageDraw.Bitmap.Canvas.DrawBitmap(ASourceBmp,
rctCurSource,rctDest, 1);
ImageDraw.Bitmap.Canvas.EndScene();

 

То появляется эффект задержки, т.е цикл идет дальше а изображение меняется с задержкой, если цикл остановить то картинка продолжает менятся еще раз 10... Пробовал убрать прорисовку в OnPaint и вызывать событие по таймеру, но кажется эффект тотже. Пробовал рисовать на PaintBox но кажется тоже самое...

 

Сталкивался ли кто с таким? с чем это связано? Как можно рисовать напрямую, т.е рисуешь и событие отображается на экране в этот же момент...

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

все верно

закончится цикл, программа исполнит рисование. 

пока программа исполняет цикл, кто будет перерисовывать экран ??

В VCL можно было вызывать в цикле Repaint для этого, тут вроде UpdateRect есть.

тут нужно в отдельном потоке готовить картинки для рисования и говорить форме Invalidate, а в OnPaint очевидно эти картинки выводить на форму

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

 

тут нужно в отдельном потоке готовить картинки для рисования и говорить форме Invalidate, а в OnPaint очевидно эти картинки выводить на форму

В общем я это понимаю, но когда работа ведется в отдельном потоке что бы что то подготовить на bmp приходится вызывать метод Synchronize, т.е он выполняется в главном потоке как я понимаю, т.е в этом же потоке в методе Synchronize я и пытаюсь рисовать на TImage.Bitmap , что достаточно удобно. Но есть проблемы первое это при активном рисование , проще говоря в цикле, похоже как возникает запаздывание прорисовки, хотя может это моя ошибка в коде...(так как там идет передача данных по сети) и вторая проблема это иногда приложение вылетает, просто без ошибки без ничего процесс в Андроиде завершается. Вот и хотел спросить у более опытных что делать.  Хотел рисовать в OnPaint но появляется какое то мерцание , поэтому рисование на битмап гораздо лучше на вид...

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

В общем немного разолбрался дело не в прорисовке а в сети, тут в FMX есть какой то буфер, т.е если не вызывать метод ReadStraem какое то время, то в системе все данные накапливаются в какойто буфер, потом чтение идет из него... причем явно есть какое то граничение на размер этих данных после чего из сети данные перестают читаться и все работает как в Винде. Флаг UseNagle я отключил сразу.

Может кто с таким сталкивался? как его отключить или уменьшить

 

2 да и вторая проблема осталась, программа почему то иногда при просировке зависает или вообще вылетает непонятно

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

Помогите разобраться. сделал как вы советовали, разместил отрисовку на Canvas в событии OnPaint главной формы. Для Винды все рисует нормально, а вот для Андроида пустой экран

Код

procedure TForm6.FormPaint(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
  var
  R: TRectF;
begin
 r:= TRectF.Create(20,20,200,200);
 Canvas.BeginScene;
 Canvas.Stroke.Color:= TAlphaColorRec.Black;
 Canvas.DrawEllipse(R,1);
 Canvas.EndScene;
end;
 
Что я сделал не так?
Ссылка на комментарий
  • 0
  • Администраторы

Почему на мобильных платформах у меня не рисуется окружность?

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

Спасибо большое, вроде нарисовалось.

Судя по вашим ответам, вы большой спец в этой области. не могли бы посоветовать хорошую книгу или другие источники по программированию для андроид на последних Делфи. А то приходится тыкаться как слепой котенок (Делфи 7, на котором раньше программировал, сильно отличается от ХЕ8)

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

 

Спасибо большое, вроде нарисовалось.

Судя по вашим ответам, вы большой спец в этой области. не могли бы посоветовать хорошую книгу или другие источники по программированию для андроид на последних Делфи. А то приходится тыкаться как слепой котенок (Делфи 7, на котором раньше программировал, сильно отличается от ХЕ8)

 

спец) он один из разработчиков Firemonkey

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

 

 

Спасибо большое, вроде нарисовалось.

Судя по вашим ответам, вы большой спец в этой области. не могли бы посоветовать хорошую книгу или другие источники по программированию для андроид на последних Делфи. А то приходится тыкаться как слепой котенок (Делфи 7, на котором раньше программировал, сильно отличается от ХЕ8)

 

спец) он один из разработчиков Firemonkey

 

ну тогда особое уважение: работать и находить время на общение со слепыми котятами типа меня - это ж какая сила воли нужна

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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...