ЛАБОРАТОРНАЯ РАБОТА №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, их назначение, свойства, методы.