Установка размера шрифта для Paintbox вызывает OnPaint - PullRequest
3 голосов
/ 05 июля 2010

Мне нужно написать текст в ящик для рисования, и я делаю это в событии OnPaint.Когда я устанавливаю размер шрифта дважды в методе, OnPaint-событие вызывается неоднократно.

Чтобы убедиться в этом, попробуйте следующее:

  1. Создайте новыйПриложение VCL Forms
  2. Поместите поле для рисования в форму
  3. Вставьте следующий код в событие OnPaint:
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  PaintBox1.Canvas.MoveTo(random(PaintBox1.Width),random(PaintBox1.Height));
  PaintBox1.Canvas.LineTo(random(PaintBox1.Width),random(PaintBox1.Height));

  PaintBox1.Font.Size := 10; 
  PaintBox1.Font.Size := 12; 
end;

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

Почему это происходит и что я могу сделать, чтобы обойти это?

1 Ответ

7 голосов
/ 05 июля 2010

Установите PaintBox1.Canvas.Font.Size вместо PaintBox1.Font.Size, и ваша проблема будет решена.

Что касается того, почему это происходит: изменение свойства шрифта элемента управления приведет к тому, что он будет признан недействительным и перерисован, и это происходит в случае, если перерисовка вызывает бесконечный цикл. К счастью, события рисования синтезируются и имеют более низкий приоритет, чем другие сообщения, иначе ваша программа зависнет.

...