Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Использование битовых образов



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

Эффект перемещения картинки может быть создан путем периодической перерисовки картинки с некоторым смещением относительно ее прежнего положения. При этом предполагается, что перед выводом картинки в новой точке сначала удаляется предыдущее изображение. Удаление картинки может быть выполнено путем перерисовки всей фоновой картинки или только той ее части, которая перекрыта битовым образом движущегося объекта.

В рассматриваемой программе используется второй подход. Картинка выводится применением метода Draw к свойству canvas компонента Image, a стирается путем копирования (метод copyRect) нужной части фона из буфера на поверхность компонента Image.

Форма программы приведена на рис. 10.18, а текст — в листинге 10.10.

Компонент image используется для вывода фона, а компонент Timer — для организации задержки между циклами удаления и вывода на новом месте изображения самолета.

Листинг 10. Летящий самолет

unit anim_;

Interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls,Forms, Dialogs, ExtCtrls, StdCtrls, Buttons;

Type

TForm1 = class(TForm)

Timer1: TTimer;

Image1: Tlmage;

procedure FormActivate(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

procedure FormClose(Sender: TObject;

var Action: TCloseAction); private

{ Private declarations } public

{ Public declarations } end;

Var Form1: TForm1;

Implementation

{$R *.DFM}

Var

Back, bitmap, Buf : TBitMap; // фон, картинка, буфер

BackRct : TRect; // область фона, которая должна быть

// восстановлена из буфера

BufRet: Trect; // область буфера, которая используется для

// восстановления фона

х,у:integer; // текущее положение картинки

W,H: integer; // размеры картинки

procedure TForm1.FormActivate(Sender: TObject);

Begin

// создать три объекта — битовых образа

Back := TBitmap.Create; // фон

bitmap := TBitmap.Create; // картинка

Buf := TBitmap.Create; // буфер

// загрузить и вывести фон

Back.LoadFromFile('factory.bmp');

Form1.Image1.canvas.Draw(0,0,Back);

// загрузить картинку, которая будет двигаться

bitmap.LoadFromFile('aplane.bmp');

// определим "прозрачный" цвет

bitmap.Transparent := True;

bitmap.TransParentColor := bitmap.canvas.pixels[1,1];

// создать буфер для сохранения копии области фона,

// на которую накладывается картинка

W:= bitmap.Width; Н:= bitmap.Height;

Buf.Width:= W; Buf.Height:=H;

Buf.Palette:=Back.Palette;

// Чтобы обеспечить соответствие палитр //

Buf.Canvas.CopyMode:=cmSrcCopy;

// определим область буфера, которая

// будет использоваться

// для восстановления фона

BufRct:=Bounds(0,0,W,H);

// начальное положение картинки

х := -W; у := 20;

// определим сохраняемую область фона

BackRct:=Bounds(x,y,W,H); // и сохраним ее

Buf.Canvas.CopyRect(BufRet,Back.Canvas,BackRct);

end;

// обработка сигнала таймера

procedure TForm1.Timer1Timer(Sender: TObject);

Begin

// восстановлением фона (из буфера) удалим рисунок

Forml.image1.canvas.Draw(x,у,Buf);

x:=x+2;

if x>fоrm1.Image1.Width then x:=-W;

// определим сохраняемую область фона

BackRct:=Bounds(x,у,W,H);

// сохраним ее копию

Buf.Canvas.CopyRect(BufRct,Back.Canvas,BackRct);

// выведем рисунок

Forml.image1.canvas.Draw(x,y,bitmap);

end;

// завершение работы программы

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

Begin

// освободим память, выделенную

// для хранения битовых образов

Back.Free;

bitmap.Free;

Buf.Free;

End; end.

 


Рис. 18. Форма программы Самолет

Для хранения битовых образов (картинок) фона и самолета, а также копии области фона, перекрываемой изображением самолета, используются объекты типа TBitMap, которые создаются динамически процедурой FormActivate. Эта же процедура загружает из файлов картинки фона (factory.bmp) и самолета (aplane.bmp), а также сохраняет область фона, на которую первый раз будет накладываться картинка.

Сохранение копии фона выполняется при помощи метода CopyRect, который позволяет выполнить копирование прямоугольного фрагмента одного битового образа в другой. Объект, к которому применяется метод CopyRect, является приемником копии битового образа. В качестве параметров методу передаются координаты и размер области, куда должно быть выполнено копирование, поверхность, откуда должно быть выполнено копирование, а также положение и размер копируемой области. Информация о положении и размере копируемой в буфер области фона, на которую будет наложено изображение самолета и которая впоследствии должна быть восстановлена из буфера, находится в структуре BackRct типа TRect. Для заполнения этой структуры используется функция Bounds.

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


Просмотр мультика

Теперь рассмотрим, как можно реализовать вывод в диалоговом окне программы простого "мультика", подобного тому, который можно видеть в диалоговом окне Установка связи при подключении к Internet .

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

Кадры мультика обычно находятся в одном файле или в одном ресурсе. Перед началом работы программы они загружаются в буфер, в качестве которого удобно использовать объект типа TBitMap. Задача процедуры, реализующей вывод мультика, состоит в том, чтобы выделить очередной кадр и вывести его в нужное место формы.

Вывести кадр на поверхность формы можно применением метода copyRect к свойству canvas этой формы. Метод CopyRect копирует прямоугольную область одной графической поверхности на другую.

Инструкция применения метода CopyRect в общем виде выглядит так:

Canvas1.CopyRect(Область1, Canvas2, 06ласть2)

где:

canvas1 — графическая поверхность, на которую выполняется копирование;

Canvas2 — графическая поверхность, с которой выполняется копирование;

параметр Область2 —- задает положение и размер копируемой прямоугольной области, а параметр областьi — положение копии на поверхности Canvas1.

В качестве параметров область! и область2 используются структуры типа TRect, поля которых определяют положение и размер области.

Заполнить поля структуры TRect можно при помощи функции Bounds, инструкция обращения к которой в общем виде выглядит так:

Bounds(x,у,Width,Height)

где:

х и у — координаты левого верхнего угла области;

width и Height — ширина и высота области.

Следующая программа, текст которой приведен в листинге 12, выводит в диалоговое окно простой мультик — дельфийскую колонну, вокруг которой "летает" некоторый объект. На рис. 19 приведены кадры этого мультика (содержимое файла film.bmp).

Диалоговое окно программы приведено на рис. 20, оно содержит один единственный компонент — таймер.

 

 


Рис. 19. Кадры мультика

 

 


Рис. 20. Форма программы



Листинг 12. Мультик (использование метода CopRect)

unit multik ;

interface

uses Windows, Messages, SysUtils, Classes,Graphics, Controls, Forms, Dialogs,ExtCtrls, StdCtrls;

Type

TForm1 = class(TForm)

Timer1: TTimer;

procedure FormActivate(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

Private

{ Private declarations }

Public

{ Public declarations }

end;

var Form1l: TForm1;

Implementation

($R *.DFM}

Const

FILMFILE = 'film2.bmp'; // фильм — bmp-файл

N_KADR=12; // кадров в фильме (для данного файла)

Var

Film: TBitMap; // фильм — все кадры

WKadr,HKadr: integer; // ширина и высота кадра

CKadr: integer; // номер текущего кадра

RectKadr: TRect; // положение и размер кадра в фильме

Rect1 : Trect; // координаты и размер области отображения фильма

procedure TForm1.FormActivate(Sender: TObject);

Begin

Film := TBitMap.Create;

Film.LoadFromFile(FILMFILE);

WKadr := Round(Film.Width/N_Kadr);

HKadr := Film.Height;

Rect1 := Bounds(10,10,WKadr,HKadr);

Ckadr:=0;

Form1.Timerl.Interval := 150; // период обновления кадров — 0.15 с

Form1.Timerl.Enabled:=True; // запустить таймер

end;

// отрисовка кадра procedure DrawKadr;

Begin

// определим положение текущего кадра в фильме

RectKadr:=Bounds(WKadr*CKadr,0,WKadr,HKadr);

// вывод кадра из фильма

Form1.Canvas.CopyRect(Rect1,Film*.Canvas,RectKadr);

// подготовимся к выводу следующего кадра

CKadr := CKadr+1;

if CKadr = N_KADR then CKadr:=0;:

end;

// обработка сигнала от таймера

procedure TForm1.Timer1Timer(Sender: TObject);

Begin

DrawKadr;

end;

End.

Программа состоит из трех процедур. Процедура TForm1. FormActivate создает объект Film и загружает в него фильм — BMP-файл, в котором находятся кадры фильма. Затем, используя информацию о размере загруженного битового образа, процедура устанавливает значения характеристик кадра: высоту и ширину.

После этого создается объект Kadr (типа TBitMap), предназначенный для хранения текущего кадра. Следует обратить внимание, что после создания объекта Kadr принудительно устанавливаются значения свойств width и Height. Если этого не сделать, то созданный объект будет существовать, однако память для хранения битового образа не будет выделена. В конце своей работы процедура TForml. FormActivate устанавливает номер текущего кадра и запускает таймер.

Основную работу в программе выполняет процедура DrawKadr, которая выделяет из фильма очередной кадр и выводит его в форму. Выделение кадра и его отрисовку путем копирования фрагмента картинки с одной поверхности на другую выполняет метод copyRect (рис. 21), которому в качестве параметров передаются координаты области, куда нужно копировать, поверхность и положение области, откуда нужно копировать. Положение фрагмента в фильме, т. е. координата х левого верхнего угла, определяется умножением ширины кадра на номер текущего кадра. Запускает процедуру DrawKadr процедура TForm1.Timer1Timer, обрабатывающая событие OnTiner.

Рис. 21. Инструкция Canvas1. CopyRect (Rect1, Canvas2, Rect2) копирует в область Rectl поверхности Canvasl область Rect2 с поверхности Canvas2

 

 


 

Тема. Диаграммы

Задание: Составить конспект.

План работы:

1 Ознакомиться с перечнем вопросов, подлежащих рассмотрению

2 Ознакомиться с представленным теоретическим материалам

3 Ответить на вопросы для самопроверки

4 Законспектировать ответы на вопросы, подлежащие рассмотрению, привести примеры

Включайте в конспект не только основные положения, но и обосновывающие их выводы, конкретные факты и примеры (без подробного описания).

5.Составляя конспект, записывайте отдельные слова сокращённо, выписывайте только ключевые слова, делайте ссылки на страницы конспектируемой литературы, применяйте условные обозначения.

6.Чтобы форма конспекта отражала его содержание, располагайте абзацы «ступеньками», подобно пунктам и подпунктам плана, применяйте разнообразные способы подчеркивания, используйте карандаши и ручки разного цвета.

Вопросы для самостоятельной работы

1 Технология создания диаграммы

2 Настройка свойств компонента

Вопросы для самоконтроля:

1 Как выбрать тип диаграммы

3 Опишите основные свойства диаграммы

 

Форма контроля: Оценка составленного конспекта.

 


Теоретический материал

Компонент Delphi Chart располагается на странице Additional Палитры компонентов. Его разработал Дэвид Бернеда. Это богатый возможностями, очень мощный компонент, позволяющий строить двух и трехмерные красивые диаграммы на основе разнообразных данных. Он имеет большое количество разнообразных свойств. Часть из них, в свою очередь, являются объектами и обладают собственными свойствами.

Значок на Палитре компонентов имеет вид.

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

 

 

Создать диаграмму можно, также с помощью мастера. Для запуска мастера из меню запускаем File -> New -> Other и попадаем в окно New Items, там на вкладке Business выбираем TeeChartWisard. Мастер потребует уточнения, на основе базы данных или нет будет строиться график. Пусть он генерируется программой (переключатель Non Database Chart - не на основе базы данных). Следующий шаг - выбор вида диаграммы, она может быть двух или трех мерной (выбор переключателя 2D или 3D). Нажав Next определяем нужна ли нам легенда (опция Show Legend), желтые подсказки, рядом с диаграммой, включает флажок Show Marks. Нажав на кнопку Finish мы получим диаграмму, заполненную случайно сгенерированными числами.

Настройка свойств компонента Chart происходит в редакторе Editing Chart. Вызвать его можно двойным щелчком по компоненту или используя свойство SeriesList Инспектора объектов.

 

 

Основные параметры диаграммы определяются на вкладке Chart (диаграмма), она, в свою очередь, состоит из набора дополнительных панелей.

Панель Ряд данных (Series) важная, в ней можно добавить на один график несколько диаграмм с помощью кнопки Add. При этом над значениями данных можно выполнять операции задаваемые во вкладке Series -> Data Source выбрав function выбрав функцию из списка function.

Панель Общие (General) содержит следующие элементы управления:

§ кнопка Export - экспорт изображения в файл,

§ кнопка Print Preview - предварительный просмотр и печать диаграммы,

§ панель Zoom - масштабирование,

§ панель AllowScroll - отвечает за прокрутку изображения.

Средства панели Оси (Axis) регулируют настройку координатных осей, заголовков, их масштаб, шаг пунктирной сетки и многое другое.

Панель Заголовков (Titles) помогает оформить заголовки.

Панель Легенда (Legend) отвечает за внешний вид и содержание легенды.

Панель Панель (Panel) задает оформление панели основы: цвет и форму границы панели (можно сделать так, что диаграмма будет расположена на панели имеющей градиентную заливку).

Панель Страницы (Paging), позволяет разделить диаграммы на страницы. Для этого необходимо в поле (точки на странице) Points per Page подобрать соответствующее значение.

Панель Границы (Walls) отвечает за цвет и границы диаграммы.

Панель 3D дает возможность настройки 3D эффектов, (изменение масштаба, положения в пространстве), простым передвиганием ползунков управления.

Вкладка Ряды данных (Series) отвечает за оформление каждого ряда данных (графиков добавленных с помощью вкладки Chart). Текущий ряд данных задается с помощью раскрывающегося списка. Наиболее важная панель Источник данных данных (Data Sourece). В ней можно выбрать отказ от генерации значений (No Data), создать случайные значения (Random Values) или сформировать значения, как результат применения функции (список Function) к значениям рядов.

Тема. Элементы управления. Отображение заголовков

Задание: Составить конспект.

План работы:

1 Ознакомиться с перечнем вопросов, подлежащих рассмотрению

2 Ознакомиться с представленным теоретическим материалам

3 Ответить на вопросы для самопроверки

4 Законспектировать ответы на вопросы, подлежащие рассмотрению, привести примеры

Включайте в конспект не только основные положения, но и обосновывающие их выводы, конкретные факты и примеры (без подробного описания).

5.Составляя конспект, записывайте отдельные слова сокращённо, выписывайте только ключевые слова, делайте ссылки на страницы конспектируемой литературы, применяйте условные обозначения.

6.Чтобы форма конспекта отражала его содержание, располагайте абзацы «ступеньками», подобно пунктам и подпунктам плана, применяйте разнообразные способы подчеркивания, используйте карандаши и ручки разного цвета.

Вопросы для самостоятельной работы

1 Управляющие элементы для разных окно

2 Заголовок окна

Вопросы для самоконтроля:

1 Перечислите элементы управления, используемые в окнах приложений

2 Какие элементы управления можно использовать в диалоговых окнах

3 Для чего может быть использован заголовок окна

4 Перечислите типы окон

 

Форма контроля: Оценка составленного конспекта.

 


Теоретический материал

Окно приложения может включать в себя элементы вроде заголовка (title bar), оконного меню (window menu, ранее известного как "системное меню"), меню (menu bar), кнопок минимизации и максимизации, кнопки восстановления (restore button), кнопки закрытия (close button), бордюра (border), клиентской области (client area), горизонтальной и вертикальной полосок прокрутки (scroll bar). Главное окно приложений часто включает в себя все эти элементы сразу. Рисунок ниже иллюстрирует эти элементы в типичном главном окне программы:

 

 

Клиентская область

Клиентская область (client area) является той частью окна, где приложение показывает основную информацию (текст или графику). Например, текстовый редактор отображает документ в клиентской области главного окна. Чтобы управлять клиентской областью окна (принимать ввод пользователя и отображать в ней информацию), приложение должно указать функцию обратного вызова, называемую оконной процедурой (window procedure). См. Window Procedures для дальнейшего обсуждения.

Неклиентская область

Заголовок, меню, оконное меню, кнопки минимизации, максимизации, закрытия и восстановления, бордюр и полосы прокрутки собирательно называются неклиентской областью окна (nonclient area). Система автоматически управляет большинством аспектов неклиентской области; приложение же управляет поведением клиентской области окна.

Заголовок окна (title bar) показывает значок окна (указывается приложением) и строку текста; обычно текст указывает название приложения и цель окна. Приложение указывает значок и текст при создании окна. Кроме того заголовок также позволяет перемещать окно по экрану, используя мышь или иное указующее устройство.

Большинство приложений добавляют окнам меню (menu bar), которое включает в себя команды, поддерживаемые приложением. Элементы в полоске меню соответствуют категориям команд меню. Щелчок по элементу меню обычно приводит к его "раскрытию": показу всплывающего меню с элементами, соответствующими заданной категории. Щёлкая по элементу-команде, пользователь просит приложение выполнить эту задачу.

Оконное меню (window menu) создаётся и управляется системой (и поэтому оно ранее называлось системным меню). Оно содержит стандартный набор команд по управлению окном - вроде изменения размера и положения окна, его закрытия.

Кнопки в верхнем-правом углу окна влияют на размер и положение окна. Когда пользователь щёлкает по кнопке максимизации (maximize button), система увеличивает окно до размера текущего монитора, так что оно займёт весь рабочий стол минус панель задач (в одномониторной конфигурации). Одновременно с этим система заменит кнопку максимизации кнопкой восстановления. Когда вы щёлкаете по кнопке восстановления (restore button), система восстанавливает окно на его исходной позиции и с исходным размером. Когда вы щёлкаете по кнопке минимизации (minimize button), система уменьшает окно до размера её кнопки на панели задач, размещает окно поверх его кнопки на панели задач и показывает кнопку на панели задач в поднятом (нормальном) состоянии (прим. пер.: это описание - упрощение). Чтобы восстановить приложение с его исходными положением и размерами - щёлкните по кнопке в панели задач. Когда вы щёлкаете по кнопке закрытия(close button), приложение выходит.

Бордюр (border) - это область по периметру окна, которая позволяет пользователю изменять размер окна, используя мышь или иное указующее устройство.

Полосы прокрутки (scroll bar) переводят ввод с клавиатуры и мыши в смещения, которые используются приложением для сдвига содержимого клиентской области. К примеру, приложение текстовый редактор может показывать большой документ с вертикальной полосой прокрутки, чтобы пользователь мог использовать её для перемещения по документу.


Поделиться:



Последнее изменение этой страницы: 2019-04-11; Просмотров: 229; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.071 с.)
Главная | Случайная страница | Обратная связь