Язык программирования Delphi, работа с графикой. Работаем с TPaintBox:
Совсем недавно, ко мне пришло письмо, с просьбой рассказать о TPaintBox. В двух словах такое не расскажешь, поэтому пришлось писать статью. Я думаю, что она будет полезна интересна многим моим читателям, потому что этот компонент имеет свои особенности.
TPaintBox чем-то похож на TBitmap, и на первый взгляд эта похожесть очень большая, но это не так. У него нет большинства нужных возможностей. Единственное, что у него есть для рисования - это Canvas. В принципе этого достаточно, но есть одна проблема - TPaintBox не умеет сохранять образы рисунка как TImage. TImage - это картинка, которая выводится на экран, поэтому она хранится памяти и показывается простым копированием. TPaintBox - это поле для рисования, и изображение не сохраняется в памяти.
Чем всё это грозит? Если TImage перекрыть другим окном, то ничего страшного не произойдёт. После открытия картинка снова будет показываться. Если перекрыть TPaintBox, то информация бесследно уничтожится. Мы уже встречались с такой проблемой, когда рисовали на форме (форма также не умеет сохранять изображения). Вывод - с тем же успехом, можно рисовать прямо на форме, без использования TPaintBox.
Но иногда, всё же удобно его использовать, для ограничения поля ввода. Например, чтобы отследить, где нажать мышь. Например, когда тебе нужно рисовать только в определённом участке на окне. В этом случае, ты в этот участок помещаешь TPaintBox и отслеживаешь события, нужные тебе для рисования, только для этого участка.
Пора перейти от слов к делу. На рисунке 1, ты можешь видеть мой пример формы. С левой стороны находится TPaintBox (его не видно, на этом месте только рисунок), с правой стороны кнопка.
Рис 1. Главная форма
Я создал два события OnMouseDown и OnMouseMove, и для обоих написал один и тот же текст:
PaintBox1.Canvas.Pixels[X,Y]:=clRed;
Теперь, если ты будешь вести мышкой над TPaintBox или давить на него, то будут появляться красные точки. Эти события не будут происходить вне TPaintBox, т.е. мы ограничили область рисования только этим компонентом.
Для кнопки я написал следующее событие:
procedure TForm1.Button1Click(Sender: TObject);
begin
PaintBox1.Canvas.Pen.Color:=clGreen;
PaintBox1.Canvas.Pen.Width:=3;
PaintBox1.Canvas.MoveTo(Random(300),Random(200));
PaintBox1.Canvas.LineTo(Random(300),Random(200));
end;
Здесь нет ничего нового, и ты можешь разобраться со всеми операторами без меня. Первая строка задаёт цвет карандаша у Canvas компонента PaintBox1. Вторая строка задаёт ширину карандаша. Третья строка перемещает текущую точку в случайное место. Последняя строка рисует линию из текущей точки в новую случайную точку.
Я больше не стал усложнять пример. Как видишь, рисование происходит так же, как мы рисовали на форме. Только тогда мы писали просто Canvas. LineTo(Random(300), Random(200)), а теперь в начале добавляется имя компонента, Canvas которого мы хотим использовать.
Запусти пример и попробуй с ним поиграть. Когда наиграешься, попробуй свернуть окно или перекрыть его другим. Все твои извращения исчезнут.
Удачи. Занятие получилось маленьким, но полезным для закрепления материала.