ЛАБОРАТОРНАЯ РАБОТА №30 Тема: Разработка поекта создания и использования графических примитивов, иллюстраций

Цель:Сформировать умения создавать проект с использованием графических примитивов, иллюстарций

Программное обеспечение: DELPHI

Оснащение:персональный компьютер, практикум

Время проведения: 2 уч. часа

 

Литература:

1. Фаронов В.В. Delphi. Программирование на языке высокого уровня: Учебник для вузов. 49-51, 400-483.

2. Бобровский С.И. Delphi 7. Учебный курс. СПб.: Питер, 2008. С. 151-182.

3. Чертик А.А., Борисок В.В., Корвель Ю.И. Delphi. Трюки и эффекты. СПб.: Питер, 2007. С. 10-48, 72-90.

4. Флёнов М.Е. Delphi в шутку и в серьез: что умеют хакеры. СПб.: Питер, 2006. С. 15-102.

ВОПРОСЫ ВХОДНОГО КОНТРОЛЯ:

1. Перечислите компоненты страницы Win32, их назначение, свойства, методы.

2. Перечислите компоненты страницы System, Dialogs и Samples, их назначение, свойства, методы.

КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

Графические компоненты

В стандартную библиотеку визуальных компонент Delphi входит несколько объектов, с помощью которых можно придать своей программе совершенно оригинальный вид. Это ― TImage (TDBImage), TShape, TBevel.

TImage позволяет поместить графическое изображение в любое место на форме. Этот объект очень прост в использовании - выберите его на странице Additional и поместите в нужное место формы. Собственно картинку можно загрузить во время дизайна в редакторе свойства Picture (Инспектор Объектов). Картинка должна храниться в файле в формате BMP (bitmap), WMF (Windows Meta File) или ICO (icon). (TDBImage отображает картинку, хранящуюся в таблице в поле типа BLOB. При этом доступен только формат BMP.)

TShape ― простейшие графические объекты на форме типа круг, квадрат и т.п. Вид объекта указывается в свойстве Shape. Свойство Pen определяет цвет и вид границы объекта. Brush задает цвет и вид заполнения объекта. Эти свойства можно менять как во время дизайна, так и во время выполнения программы.

TBevel ― объект для украшения программы, может принимать вид рамки или линии. Объект предоставляет меньше возможностей по сравнению с TPanel, но не занимает ресурсов. Внешний вид указывается с помощью свойств Shape и Style.

 

Свойство объектов Canvas

У ряда объектов из библиотеки визуальных компонент есть свойство Canvas (канва), которое предоставляет простой путь для рисования на них. Эти объекты - TBitmap, TComboBox, TDBComboBox, TDBGrid, TDBListBox, TDirectoryListBox, TDrawGrid, TFileListBox, TForm, TImage, TListBox, TOutline, TPaintBox, TPrinter, TStringGrid. Canvas является в свою очередь объектом, объединяющим в себе поле для рисования, карандаш (Pen), кисть (Brush) и шрифт (Font). Canvas обладает также рядом графических методов: Draw, TextOut, Arc, Rectangle и др.


Свойства Canvas:

Brush ― кисть, является объектом со своим набором свойств:

Bitmap ― картинка размером строго 8x8, используется для заполнения (заливки) области на экране.

Color ― цвет заливки.

Style ― предопределенный стиль заливки; это свойство конкурирует со свойством Bitmap ― какое свойство Вы определили последним, то и будет определять вид заливки.

Handle ― данное свойство дает возможность использовать кисть в прямых вызовах процедур Windows API.

ClipRect ― (только чтение) прямоугольник, на котором происходит графический вывод.

CopyMode ― свойство определяет, каким образом будет происходить копирование (метод CopyRect) на данную канву изображения из другого места: один к одному, с инверсией изображения и др.

Font ― шрифт, которым выводится текст (метод TextOut).

Handle ― данное свойство используется для прямых вызовов Windows API.

Pen ― карандаш, определяет вид линий; как и кисть (Brush) является объектом с набором свойств:

Color ― цвет линии

Handle ― для прямых вызовов Windows API

Mode ― режим вывода: простая линия, с инвертированием, с выполнением исключающего или и др.

Style ― стиль вывода: линия, пунктир и др.

Width ― ширина линии в точках

PenPos ― текущая позиция карандаша, карандаш рекомендуется перемещать с помощью метода MoveTo, а не прямой установкой данного свойства.

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

 

Методы Canvas:

Методы для рисования простейшей графики ― Arc, Chord, LineTo, Pie, Polygon, PolyLine, Rectangle, RoundRect. При прорисовке линий в этих методах используются карандаш (Pen) канвы, а для заполнения внутренних областей - кисть (Brush).

Методы для вывода картинок на канву ― Draw и StretchDraw, В качестве параметров указываются прямоугольник и графический объект для вывода (это может быть TBitmap, TIcon или TMetafile). StretchDraw отличается тем, что растягивает или сжимает картинку так, чтобы она заполнила весь указанный прямоугольник.

Методы для вывода текста ― TextOut и TextRect. При выводе текста используется шрифт (Font) канвы. При использовании TextRect текст выводится только внутри указанного прямоугольника. Длину и высоту текста можно узнать с помощью функций TextWidth и TextHeight.

 

Объект TPaintBox

На странице System Палитры Компонент есть объект TPaintBox, который можно использовать для построения приложений типа графического редактора или, например, в качестве места построения графиков (если, конечно, у Вас нет для этого специальных компонент третьих фирм). Никаких ключевых свойств, кроме Canvas, TPaintBox не имеет, собственно, этот объект является просто канвой для рисования. Важно, что координаты указателя мыши, передаваемые в обработчики соответствующих событий (OnMouseMove и др.), являются относительными, т.е. это смещение мыши относительно левого верхнего угла объекта TPaintBox, а не относительно левого верхнего угла формы.


МЕТОДИЧЕСКИЕ УКАЗАНИЯ

Для оперативного хранения изображений и подписей к ним используется следующий список строк:

private

slBitMap: TSringList;

Этот список необходимо создать и наполнить в момент создания окна и уда­лить при его уничтожении. Эти операции осуществляются в обработчиках событий OnCreate и OnDestroy формы. Обратите внимание: в константе Bmp_Path указывается стандартный путь доступа к графическим файлам. Если на вашем компьютере они установлены в другой папке, эту константу нужно соответствующим образом изменить, после этого полезно осуществить прогон программы и убедиться в доступности файлов.

Чтобы отобразить текст подписи в окне редактора (оно появляется автомати­чески после щелчка на подписи), необходимо создать обработчик события OnGet-EditText. В нем строка списка slBitMap, индекс которой вычисляется на основе текущих колонки и ряда табличной ячейки, передается встроенному в компонент редактору. Поскольку в программе разрешается редактировать текст подписи, об­работчик OnSetEditText осуществляет обратные действия и сохраняет в списке slBitMap отредактированную подпись. Обработчик OnDrawCell обязательно создается для любого компонента TDrawGrid, так как без него компонент не смо­жет заполнить пустые ячейки каким-либо изображением и/или текстом.

Чтобы согласовать размеры ячеек таблицы с размерами окна программы, используется обработчик события OnResize (это событие возникает при каждом изменении размеров окна). Высота (ширина) каждой ячейки устанавливается равной половине высоты (ширины) клиентской области формы минус 1 пиксел. Этот запас предотвращает автоматическую вставку в таблицу полос прокрутки (табл. 32.1).

 

Таблица 32.1 ― Рекомендации по выполнению задания

Свойство Значение Комментарий
Align alClient Таблица занимает всю клиентскую часть экрана
ColCount В таблице 2 колонки
FixedCols Нет фиксированных колонок
FixedRows Нет фиксированных рядов
Name dgDraw Имя таблицы
Options.goEditing True Разрешено редактирование текста
RowCount В таблице 2 строки
ScrollBars sbNone Не надо вставлять полосы прокрутки

procedure TTfmDrawGrid.dgDrawGridGetEditText(Sender: TObject; ACol, ARow: Integer; var Value: string);

// Передает в редактируемое поле текст, из ячейки

begin

Value := slBitMap[2 * ACol + Arow]

end;

procedure TTfmDrawGrid.dgDrawGridSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: string);

// Получает текст из редактируемого поля и сохраняет его в slBitMap

begin

slBitMap[2 * ACol + ARow] := Value

end;

procedure TTfmDrawGrid.FormCreate(Sender: TObject);

const

FNames : array [0..3] of String = ('c:\bmp1.bmp', 'c:\bmp2.bmp', 'c:\bmp3.bmp', 'c:\bmp4.bmp');

Var k: Integer;

begin

// Создаем список строк:

slbitmap := TStringList.Create;

// Вставляем в него названия файлов и картинки:

with slbitmap do for k := 0 to 3 do

begin

Add (FNames [k]) ;

Objects [k] := TBitMap.Create;

(Objects[k] as TBitMap).LoadFromFile (FNames[k])

end;

procedure TTfmDrawGrid.FormDeactivate(Sender: TObject);

begin // Удаляем список slBitMap при разрушении формы

slBitMap.Free

end;

procedure TTfmDrawGrid.FormResize(Sender: TObject);

// Изменяет размеры ячеек при изменении размеров окна.

// Запас в один пиксел необходим для предотвращения автоматической прокрутки

begin

with dgDrawGrid do

begin

DefaultColWidth := ClientRect.Right div 2 - 1; DefaultRowHeight := ClientRect.Bottom div 2-1

end;

end;

procedure TTfmDrawGrid.dgDrawGridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);

// Рисует картинку из slBitMap.Objects и текст из slBitMap

Var k: Integer;

begin

k := 2 * ACol + ARow;

with dgDrawGrid.Canvas, Rect, slBitMap do begin

// Уменьшаем высоту картинки для вывода под ней текста:

Bottom := Bottom - TextHeight('1') -2;

// Рисуем картинку:

StretchDraw(Rect, (Objects[k] as TBitMap));

// Центрируем текст по горизонтали и выводим его:

TextOut(Left+(Right-Left-TextWidth(slBitMap[k])) div 2, Bottom + 1, slBitMap [k])

end // with dgDraw.Canvas, Rect, slBitMap do

end;

СОДЕРЖАНИЕ РАБОТЫ:Создать таблицу 2х2 для отображения в ее ячейках изображений в формате *.bmp.

 

ВОПРОСЫ ВЫХОДНОГО КОНТРОЛЯ:

Опишите свойство Canvas и его использование.

ДОМАШНЕЕ ЗАДАНИЕ

Выучить компоненты страниц Standard, Additional, Win32, System, Dialogs и Samples, их назначение, свойства, методы.