Хелпикс

Главная

Контакты

Случайная статья





Практикум. Сохранение рисунка



Практикум

 

Измените программу так, чтобы при нажатии на кнопку на форме появлялся домик с подписью, примерно такой, как на рисунке:

Для закраски двери используйте коричневый цвет (R=140, G=70, B=20).

 

 
       

2. Сохранение рисунка

  Еще раз запустите программу, и выведите рисунок на форму. После этого сверните окно программы (кнопка в заголовке окна программы) и снова раскройте его. Сохранился ли рисунок?

А рисунок не сохранился. Почему?

Дело в том, что мы рисовали домик прямо на экране, холст Canvas нигде не хранит это изображение, поэтому при сворачивании окна оно было потеряно. Где же выход?

Чтобы ответить на этот вопрос, нужно понять, как строится изображение в окне программы. Дело в том, что Windows не хранит изображения окон программ. Каждая программа обязана уметь перерисовать свое окно, когда получит от операционной системы специальной сообщение WM_PAINT. Например, это случается при разворачивании окна из свернутого состояния. Перехватить это сообщение можно с помощью события OnPaint.

  Создайте обработчик события OnPaint для формы, вызвав в нем процедуру Draw. Проверьте, решило ли это проблему.

Теперь рисунок на форме появляется сразу, хотя и сохраняется при любых действиях с окном. Для того, чтобы мы видели рисунок только после нажатия на кнопку, введем логическую переменную IsReady, которой будем устанавливать значение True в обработчике OnClick кнопки. Напомним, что во все глобальные переменные при создании записываются нулевые значения, для логической переменной это соответствует значению False.

  Объявите глобальную логическую переменную IsReady. В обработчике OnClick присвойте ей значение True. Измените обработчик OnPaint чтобы процедура Draw вызывалась только при истинном значении переменной IsReady. Проверьте работу программы.

Показанный прием (перерисовка в обработчике OnPaint) хорошо работает, когда рисунок несложный и перерисовать его — дело сотых долей секунды. Теперь представьте, что рисунок строится очень долго (минуты или даже часы), например, в ходе сложных расчетов или эксперимента. Перерисовать его быстро невозможно, значит, изображение нужно где-то хранить, конкретнее — в памяти.

Для хранения изображений в памяти служит класс TBitmap (bitmap — битовая карта). При запуске программы рисунок в памяти нужно создать (вызвав конструктор TBitmap.Create), а при завершении работы — удалить из памяти с помощью метода-деструктора Free.

  Объявите глобальную переменную bmp типа TBitmap: var bmp: TBitmap;
 

В обработчике OnCreate формы создайте рисунок в памяти:

bmp := TBitmap.Create; bmp.Width := 300; bmp.Height := 300;

Свойства Width и Height задают ширину и высоту рисунка в пикселях.

 

  В обработчике OnDestroy, который вызывается при уничтожении формы, освободите память: bmp.Free;

Теперь в процедуре Draw нам нужно рисовать не на форме, а на холсте объекта bmp, поэтому она должна выглядеть так:

with bmp.Canvas do begin...end;
  Измените процедуру Draw, чтобы рисование выполнялось в памяти на холсте объекта bmp. Запустите программу и проверьте ее работу, попытайтесь понять, почему рисунка не видно.

Теперь процедура Draw рисует только в памяти, поэтому мы не видим картинки. Чтобы это исправить, в обработчике OnPaint формы нужно выводить на холст формы битовую карту, что можно сделать м помощью метода Canvas.Draw:

Canvas.Draw ( 0, 0, bmp );

Первые два параметра — это координаты верхнего левого угла рисунка, третий — адрес рисунка в памяти.

Еще один метод, Canvas.StretchDraw, позволяет изменять размеры выводимого рисунка (растягивать или сжимать его). Его первый параметр — прямоугольник, в котором нужно вывести рисунок. Это объект типа TRect, его можно построить с помощью функции Rect (мы уже делали это при вызове метода FillRect).

  Измените обработчик события OnPaint так, чтобы вывести на форму сам рисунок и его уменьшенную копию (справа): if IsReady then begin Canvas.Draw ( 0, 0, bmp ); Canvas.StretchDraw(Rect(300, 150, 390, 240), bmp); end; Запустите программу и щелкните по кнопке. Теперь сверните окно программы и разверните его заново. Попробуйте объяснить результат.

Итак, щелчок по кнопке не привел к появлению рисунка. Это наводит на мысль (и это действительно так!), что обработчик OnPaint не был вызван. Чтобы его вызвать, в обработчик OnClick кнопки нужно добавить вызов метода Repaint (перерисовать) для формы.

  Добавьте в обработчик OnClick вызов метода Repaint; и проверьте работу программы. После этого можно закрыть проект.

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.