|
||||||||||||||||||||||||||||||||
Практикум. Сохранение рисунка ⇐ ПредыдущаяСтр 4 из 4 Практикум
2. Сохранение рисунка
А рисунок не сохранился. Почему? Дело в том, что мы рисовали домик прямо на экране, холст Canvas нигде не хранит это изображение, поэтому при сворачивании окна оно было потеряно. Где же выход? Чтобы ответить на этот вопрос, нужно понять, как строится изображение в окне программы. Дело в том, что Windows не хранит изображения окон программ. Каждая программа обязана уметь перерисовать свое окно, когда получит от операционной системы специальной сообщение WM_PAINT. Например, это случается при разворачивании окна из свернутого состояния. Перехватить это сообщение можно с помощью события OnPaint.
Теперь рисунок на форме появляется сразу, хотя и сохраняется при любых действиях с окном. Для того, чтобы мы видели рисунок только после нажатия на кнопку, введем логическую переменную IsReady, которой будем устанавливать значение True в обработчике OnClick кнопки. Напомним, что во все глобальные переменные при создании записываются нулевые значения, для логической переменной это соответствует значению False.
Показанный прием (перерисовка в обработчике OnPaint) хорошо работает, когда рисунок несложный и перерисовать его — дело сотых долей секунды. Теперь представьте, что рисунок строится очень долго (минуты или даже часы), например, в ходе сложных расчетов или эксперимента. Перерисовать его быстро невозможно, значит, изображение нужно где-то хранить, конкретнее — в памяти. Для хранения изображений в памяти служит класс TBitmap (bitmap — битовая карта). При запуске программы рисунок в памяти нужно создать (вызвав конструктор TBitmap.Create), а при завершении работы — удалить из памяти с помощью метода-деструктора Free.
Теперь в процедуре Draw нам нужно рисовать не на форме, а на холсте объекта bmp, поэтому она должна выглядеть так: with bmp.Canvas do begin...end;
Теперь процедура Draw рисует только в памяти, поэтому мы не видим картинки. Чтобы это исправить, в обработчике OnPaint формы нужно выводить на холст формы битовую карту, что можно сделать м помощью метода Canvas.Draw: Canvas.Draw ( 0, 0, bmp );Первые два параметра — это координаты верхнего левого угла рисунка, третий — адрес рисунка в памяти. Еще один метод, Canvas.StretchDraw, позволяет изменять размеры выводимого рисунка (растягивать или сжимать его). Его первый параметр — прямоугольник, в котором нужно вывести рисунок. Это объект типа TRect, его можно построить с помощью функции Rect (мы уже делали это при вызове метода FillRect).
Итак, щелчок по кнопке не привел к появлению рисунка. Это наводит на мысль (и это действительно так!), что обработчик OnPaint не был вызван. Чтобы его вызвать, в обработчик OnClick кнопки нужно добавить вызов метода Repaint (перерисовать) для формы.
|
||||||||||||||||||||||||||||||||
|