ОП_8.ppt
- Количество слайдов: 64
2011 Часть 3 Создание приложений Windows МГТУ им. Н. Э. Баумана Факультет Информатика и системы управления Кафедра Компьютерные системы и сети Лектор: д. т. н. , проф. Иванова Галина Сергеевна 1
Введение. Особенности программирования «под Windows» Управление техническими средствами осуществляется через API (Application Program Interface) – набор из нескольких тысяч функций, выполняющих все системно-зависимые действия, такие как выделение памяти, вывод на экран и т. д. 2
Принцип событийного управления Приложение (в отличие от программы) – набор подпрограмм, вызываемых при наступлении некоторого события, которым считается любое изменение в системе, касающееся данного приложения. Каждому приложению на экране соответствует окно. Окно – самостоятельно существующий объект, параметры которого хранятся в специальной структуре данных, а поведение определяется 3 обработчиками сообщений, составляющими оконную функцию.
Структура приложения Минимально любое приложение Windows состоит из двух частей: основной программы и оконной функции. Появившиеся в очереди сообщения выбираются циклом обработки сообщений и передаются через Windows соответствующей оконной функции приложения. Для выполнения действий обработчики сообщений обращаются к 4 функциям API.
Обработка сообщения от клавиатуры 5
Завершение приложения 6
2011 Глава 8 Программирование в среде Delphi с использованием библиотеки VCL МГТУ им. Н. Э. Баумана Факультет Информатика и системы управления Кафедра Компьютерные системы и сети Лектор: д. т. н. , проф. Иванова Галина Сергеевна 7
8. 1 События Delphi и их обработчики Обработчики сообщений Windows предусмотрены у объектов класса TForm и классов управляющих компонентов, таких как кнопки, редакторы и т. п. Обработка выполняется следующим образом: 1. В системе происходит событие, например, пользователь передвинул мышь или нажал на клавишу клавиатуры, в результате генерируется сообщение об этом событии – сообщение Windows. 2. Сообщение Windows диспетчируется конкретному приложению. 3. В приложении сообщение передается активному компоненту (окну или управляющему элементу). 4. Метод обработки сообщения Windows компонента инициирует заранее предусмотренные события Delphi. 5. Если в приложении предусмотрен соответствующий обработчик события Delphi, то он вызывается, если нет – то продолжается обработка сообщения Windows. 8
События Delphi Обработчики сообщений Windows, встроенные в классы компонентов VCL, инициируют множество событий Delphi. Например, обработчик события клавиатуры WM_CHAR класса TForm инициирует три события Delphi. Сообщение Windows Событие Delphi 9
Обработчики событий Delphi Для каждого обработчика событий предусмотрен заголовок и определеный список передаваемых ему параметров. Имя компонента Имя события Delphi а) procedure TForm 1. Form. Activate(Sender: TObject); Параметр Sender – отправитель (инициатор события). б) procedure TForm 1. Edit 1 Key. Press(Sender: TObject; var Key: Char); Параметр Key – символ ANSI. в) procedure TForm 1. Edit 1 Key. Down(Sender: TObject; var Key: Word; Shift: TShift. State); Параметры: Key – виртуальный код, Shift – управляющие клав. г) procedure TForm 1. Edit 1 Key. Up(Sender: TObject; var Key: Word; Shift: TShift. State); 10
8. 2 Класс формы TForm Основное окно приложения строится на базе класса TForm. При входе в Delphi предоставляется заготовка приложения, которая «умеет» (содержит определенные обработчики сообщений Windows) выполнять стандартные действия. Свойства: Caption – заголовок окна (по умолчанию Form 1); Form. Style – вид формы(обычное, родительское, дочернее, неперекрываемое); Width, Height, Top, Left – размеры и местоположение; Color – цвет фона; TForm Font – характеристики шрифта; Cursor – форма курсора мыши и т. д. TForm 1 Методы: Show – показать; Hide – спрятать; Close – закрыть; Show. Modal – показать в модальном режиме и т. д. Компоненты Обработчики событий 11
События Delphi, обрабатываемые объектами класса TForm а) при изменении состояния формы: On. Create – в начальной стадии создания формы - используется при необходимости задания параметров (цвет или размер); On. Activate – при получении формой фокуса ввода (окно становится активным и ему адресуется весь ввод с клавиатуры); On. Show – когда форма (окно) становится видимой; On. Paint – при необходимости нарисовать или перерисовать форму; On. Resize - при изменении размеров формы на экране; On. Deactivate – при потере формой фокуса ввода (окно становится неактивным); On. Hide – при удалении формы с экрана (окно становится невидимым); On. Close. Query – при попытке закрыть форму - обычно используется для создания запроса-подтверждения необходимости закрытия окна; On. Close – при закрытии формы; On. Destroy – при уничтожении формы; 12
События Delphi для класса TForm (2) б) от клавиатуры и мыши: On. Key. Pressed – при нажатии клавиш, которым соответствует код ANSI; On. Key. Down, On. Key. Up – при нажатии и отпускании любых клавиш. I; On. Click, On. Dbl. Click – при обычном и двойном нажатии клавиш мыши; On. Mouse. Move – при перемещении мыши (многократно); On. Mouse. Down, On. Mouse. Up – при нажатии и отпускании клавиш мыши; в) при перетаскивании объекта мышью: On. Drag. Drop – в момент опускания объекта на форму; On. Drag. Over – в процессе перетаскивания объекта над формой (многократно); г) другие: On. Help – при вызове подсказки; On. Change – при изменении содержимого компонент. 13
8. 3 Основные визуальные компоненты и средства визуализации сообщений пользователю 1. Метка (класс TLabel) Метка – окно с текстом и может использоваться для формирования на форме некоторых надписей или подписей. Основные свойства: Caption – заголовок – текст, выводимый в окне компонента. Name – имя компонента в программе. Visible – определяет видимость компонента. Alignment – определяет способ выравнивания текста в окне компонента: ta. Center - по центру; ta. Left. Justify - по левой границе; ta. Right. Justify - по правой границе. Font – определяет шрифт текста. Color – определяет цвета текста и фона в окне. Word. Wrap – определяет, разбивать или нет текст на строки. Transparent – определяет, виден ли рисунок фона через окно. 14
Основные визуальные компоненты (2) 2. Строчный редактор (класс TEdit) Компонент представляет собой окно, обычно выделенное цветом, которое может использоваться, например, для организации ввода информации. Основные свойства: Text – строка текста. Read. Only – определяет возможность ввода информации в окно. Name – имя компонента в программе. Visible – определяет видимость компонента. Enable – доступность компонента. Основные методы: Clear – очистка поля Text. Set. Focus – установка фокуса ввода. Основные события: On. Key. Pressed – нажатие алфавитно-цифровой клавиши. 15
Основные визуальные компоненты (3) 3. Кнопка Компонент представляет собой окно, в котором размещается название кнопки. Используется для инициирования каких-либо действий. Основные свойства: Caption - название кнопки. Name – имя компонента в программе. Visible – определяет видимость компонента. Enable – доступность компонента. Default – определяет, генерируется ли событие On. Click для данной кнопки при нажатии клавиши Enter. Cancel – аналогично, но для клавиши Esc. Основные события: On. Click – «щелчок» мышкой в зоне компонента. Основные методы: Set. Focus – установка фокуса ввода. 16
Средства визуализации сообщений пользователю 1 Метод Message. Box (класс TApplication) function Message. Box(Text, Caption: PChar; Flags: Longint=MB_OK): Integer; Пример: Application. Message. Box('Строка пуста', 'Error', mb_Ok); Возвращает код ответа. 2 Функция Message. Dlg function Message. Dlg(const Msg: string; Dlg. Type: TMsg. Dlg. Type; Buttons: TMsg. Dlg. Buttons; Help. Ctx: Longint): Word; Пример: Message. Dlg('Поле пусто', mt. Error, [mb. Ok], 0); 17
Вычисление квадрата заданного числа Form 1: Name: =Main. Form; Caption: ='Возведение в квадрат'; Label 1: Name: ='Input. Label'; Caption: ='Введите число'; Label 2: Name: =Out. Put. Label; Caption: ='Квадрат числа равен: '; Edit 1: Name: =Input. Edit; Edit 2: Name: =Out. Put. Edit; Enable: =false; Read. Only: =true; Button 1: Name: =Next. Button; Caption: ='Следующее'; Button 2: Name: =Exit. Button; Caption: ='Выход'; 18
Формы интерфейса 19
Диаграмма состояний интерфейса Нормальное состояние 20
Объектная декомпозиция 21
Определение обрабатываемых событий по диаграмме состояний интерфейса С 1 – активация формы; С 2 – ввод Enter; С 3 – нажатие кнопки Выход; С 4 – нажатие кнопки Следующее; С 5 – нажатие кнопки OK 22
Диаграмма классов приложения 23
Файл проекта Program Ex 8_01; Uses Forms, Main. Unit in 'Main. Unit. pas' {Main. Form}; {$R *. RES} begin Application. Initialize; Application. Create. Form(TMain. Form, Main. Form); Application. Run; end. 24
Файл Main. Unit; interface Uses Windows, Messages, Sys. Utils, Classes, Graphics, Controls, Forms, Dialogs, Std. Ctrls, Ext. Ctrls; Type TMain. Form = class(TForm) Bevel 1: TBevel; Next. Button, Exit. Button: TButton; Input. Label, Out. Put. Label: TLabel; In. Put. Edit, Out. Put. Edit: TEdit; procedure Form. Activate(Sender: TObject); procedure In. Put. Edit. Key. Press(Sender: TObject; var Key: Char); procedure Next. Button. Click(Sender: TObject); procedure Exit. Button. Click(Sender: TObject); private { Private declarations } public { Public declarations } end; 25
Файл Main. Unit (2) var Main. Form: TMain. Form; implementation {$R *. DFM} procedure TMain. Form. Activate(Sender: TObject); begin Next. Button. Enabled: =false; In. Put. Edit. Read. Only: =false; In. Put. Edit. Clear; In. Put. Edit. Enabled: =true; In. Put. Edit. Set. Focus; Out. Put. Label. Visible: =false; Out. Put. Edit. Visible: =false; end; 26
Файл Main. Unit (3) procedure TMain. Form. In. Put. Edit. Key. Press(Sender: TObject; var Key: Char); var x: real; Code: integer; begin If Key=#13 then begin Key: =#0; Val(In. Put. Edit. Text, x, Code); if Code=0 then begin Input. Edit. Read. Only: =true; Input. Edit. Enabled: =false; Out. Put. Label. Visible: =true; Out. Put. Edit. Text: =floattostr(sqr(x)); Next. Button. Enabled: =true; Next. Button. Set. Focus; 27 end
Файл Main. Unit (4) else begin Message. Dlg('Недопустимые символы. ', mt. Error, [mb. Ok], 0); end end; procedure TMain. Form. Next. Button. Click(Sender: TObject); begin Form. Activate(Next. Button); end; procedure TMain. Form. Exit. Button. Click(Sender: TObject); begin Close; end. 28
8. 4 Более сложные элементы Delphi Pascal Дополнительные скалярные типы данных а) целый Cardinal 0. . 2147483647 б) логические Byte. Bool 1 байт Word. Bool 2 байта Long. Bool 4 байта без знака 4 байта true – любое число, кроме 0 в) символьные ANSIChar 1 байт (ANSI) Wide. Char 2 байта (Unicode) г) вещественные – денежный: Currency -922337203685477. 5808. . 922337203685477. 5807 8 байт 29
Строковые типы a) Short. String – до 255 символов, 0 -й байт – длина строки; б) Ansi. String – указатель на строку ANSI символов, Wide. String – указатель на строку символов Unicode: в) String: {$H+} ==ANSIString; {$H-} ==Short. String; Исключение! String[<Максимальная длина>] – всегда Short. String Для перечисленных строк определены операции конкатенации и сравнения, а также специальные функции в System и Sys. Utils г) PChar – указатель на массив символов, завершающийся нулем. Строки совместимы: <строка, кроме PChar> : = <любая строка или символ> <строка PChar >: = <строковая константа или PChar(строка)> 32
Дополнительные процедуры и функции 1) function ANSILower. Case(const S: String): String – заменяет прописные буквы на строчные; 2) function ANSIUpper. Case(const S: String): String – заменяет строчные буквы на прописные; 3) function Str. To. Int(S: String): Integer – преобразует строку в целое число; 4) function Str. To. Int. Def(S: String; Default: Integer): Integer – то же + возвращает код ошибки; 5) function Str. To. Int. Range(S: String; Min. . Max: Long. Int): Long. Int – то же + генерирует исключение ERange. Error, если не входит в диапазон; 6) function Str. To. Float(S: String): Extended – преобразует строку в вещественное число, в качестве разделителя использует символ, указанный при настройке Windows; 33
Дополнительные процедуры и функции (2) 7) function Int. To. Str(V: Integer): String – преобразует целое число в строку символов; 8) function Int. To. Hex(V: Integer; Digits: Integer): String – преобразует целое число в строку шестнадцатеричных символов, минимальной длины. Digits; 9) function Float. To. Str(V: Extended): String – преобразует вещественное число в строку символов. 34
Файлы 1. Изменены некоторые служебные слова и названия процедур: Text. File Assign. File Close. File 35
Классы Delphi Основная особенность: все объекты размещаются в динамической памяти. Описание класса: Type <Имя объявляемого класса> = class(<Имя родителя>) private
Конструктор и деструктор Переменные класса являются ссылками. В отличие от указателей операция разыменования при работе с ними не используется. Конструктор Create и деструктор Destroy класса должны содержать вызов конструктора и деструктора TObject, которые обеспечивают выделение и освобождение памяти: Constructor <Имя класса>. Create; begin inherited Create; . . . end; Destructor Destroy; override; {деструктор виртуальный!} Destructor <Имя класса>. Destroy; begin. . . inherited Destroy; end; 38
Сравнение объектных моделей Простая модель Type p. TNum = ^TNum; TNum = Object n: integer; procedure Init (an: integer); end; Procedure TNum. Init; begin n: =an; end; . . . Var p: p. TNum; Begin New(p, Init(5)); Write. Ln(p^. n); Dispose(p); End. 39 Модель VCL Type TNum = class public n: integer; constructor Create (an: integer); end; Constructor TNum. Create; begin inherited Create; n: =an; end; . . . Var A: TNum; . . . A: =TNum. Create(5); Write. Ln(A. n); A. Destroy; . . .
Особенности работы с объектами Var A, B: TNum; A: =TNum. Create; B: =A; B. Destroy; A. n: =3; {!!!} 40
Особенности переопределения методов 1) виртуальные методы: procedure Print; virtual; {в базовом класса} procedure Print; override; {в производном классе} 2) абстрактные методы: procedure Print; virtual; abstract; procedure Print; override; {в базовом класса} {в производном классе} Класс, содержащий абстрактные методы, называется абстрактным. Объекты абстрактного класса создавать не разрешается. 41
8. 5 События Мыши 1 Событие «Нажатие кнопки мыши над компонентом окна приложения» : procedure <Имя компонента> Mouse. Down(Sender: TObject; Button: TMouse. Button; Shift: TShift. State; X, Y: Integer); где Button: TMouse. Button - определяет, какая кнопка нажата: type TMouse. Button = (mb. Left, mb. Right, mb. Middle); соответственно, левая, правая или средняя кнопки. Shift: TShift. State - определяет нажатые управляющих клавиш клавиатуры и мыши: type TShift. State = set of (ss. Shift, ss. Alt, ss. Ctrl, ss. Left, ss. Right, ss. Middle, ss. Double); X, Y: Integer - координаты мыши относительно компонента. 42
События Мыши (2) 2 Событие «Движение мыши» : procedure <Имя компонента>Mouse. Move(Sender: TObject; Shift: TShift. State; X, Y: Integer); 3 Событие «Отпускание клавиши мыши» : procedure <Имя компонента>Mouse. Up(Sender: TObject; Button: TMouse. Button; Shift: TShift. State; X, Y: Integer); 43
8. 6 Создание графических изображений Изображения в Windows создаются с помощью типов: n точка, n прямоугольник; и компонентов: n перо, которое используется для рисования линий; n кисть, которая используется для закрашивания замкнутых фигур; n шрифт, который используется при выводе надписей; n холст, на котором выполняются изображения. 44
Точка и прямоугольник Точка – тип, позволяющий определить точку на экране: type TPoint = record X: Longint; Y: Longint; end; Прямоугольник – тип, используемый для задания прямоугольника: type TRect = record case Integer of 0: (Left, Top, Right, Bottom: Integer); 1: (Top. Left, Bottom. Right: TPoint); end; 45
Компонент перо (класс TPen) C помощью класса TPen создается объект Перо, служащий для вычерчивания линий, контуров и т. п. Свойства: Color: TColor – цвет вычерчиваемых линий; Width: Integer – толщина линии в пикселях экрана; Style: TPen. Style – стиль линий – учитывается только для толщины 1 пиксель: ps. Solid, ps. Dash, ps. Dot, ps. Dash. Dot, ps. Clear, ps. Inside. Frame; Mode: TPen. Mode – способ взаимодействия линий с фоном, например, pm. Black – только черные линии, pm. White – только белые линии, pm. Nop – линии не видны на фоне, pm. Not – инверсия фона и т. д. . 46
Компонент Кисть (класс TBrush) Объекты класса TBrush служат для заполнения внутренего пространства. Свойства: Color: TColor – цвет кисти: cl. Aqua (прозрачный), cl. Black, cl. Blue, cl. Dk. Gray, cl. Fuchsia, cl. Gray, cl. Green, cl. Lime (салатовый), cl. Lt. Gray, cl. Maroon (каштановый), cl. Navy (синий), cl. Olive, cl. Purple (фиолетовый), cl. Red, cl. Silver (серебряный), cl. Teal, cl. White, cl. Yellow Style: TBrush. Style – стиль кисти, например: bs. Solid, bs. Clear, bs. Horizontal, bs. Vertical, bs. FDiagonal, bs. BDiagonal, bs. Cross, bs. Diag. Cross; Bit. Map: TBit. Map – растровое изображение, которое будет использоваться кистью для заполнения, если свойство определено, то цвет и стиль игнорируются. 47
Компонент Шрифт (класс TFont) Объект класса TFont – определяет шрифт, которым выводится текст. Свойства: Charset: TFont. Char. Set – набор символов: RUSSIANCHARSET – русский, OEM_CHARSET – текст MS DOS; Name: TFont. Name – имя шрифта, по умолчанию – MS Sans Serif; Color: TColor – цвет; Height: Integer – высота в пикселях; Size: Integer – высота в пунктах (1/7 дюйма); Pitch: TFont. Pitch – способ расположения букв в тексте: fp. Fixed – моноширный текст, fp. Variable – пропорциональный текст, fp. Default – ширина шрифта по умолчанию; Style: TFont. Style – стиль шрифта – комбинация из: fs. Bold – полужирный, fs. Italic – курсив, fs. Underline – подчеркнутый, fs. Strike. Out – перечеркнутый. 48
Компонент Канва (класс TCanvas) Класс создает Канву – холст для рисования. Свойства: Brush: TBrush – кисть; Pen: TPen – перо; Font: TFont – шрифт; Pen. Pos: TPoint – определяет текущее положение пера над холстом в пискелях относительно левого верхнего угла; Copy. Mode: TCopy. Mode – способ взаимодействия растрового изображения с цветом фона, используется при копировании части канвы на другую методом Copy. Rect: cm. Blackness – заполнение черным цветом, cm. Dest. Invert – заполнение инверсным фоном, cm. Src. Copy – копирует изображение источника на канву и т. д. ; Pixels[X, Y: Integer]: TColor – массив пикселей канвы. 49
Основные методы класса TCanvas procedure Move. To(X, Y: Integer) – перемещает перо в указанную точку; X, procedure Line. To(X, Y: Integer)– чертит линию Y из текущей точки в заданную; X 1, Y 1 procedure Rectangle(X 1, Y 1, X 2, Y 2: Integer)– рисует и закрашивает кистью прямоугольник; X 2, Y 2 procedure Polyline(Points: array of TPoint)– рисует ломаную линию; type TPoint = record X, Y: Longint; end; procedure Polygon(Points: array of TPoint)– рисует и закрашивает кистью многоугольник; procedure Ellipse(X 1, Y 1, X 2, Y 2: Integer)– рисует эллипс в заданном прямоугольнике и закрашивает кистью; procedure Frame. Rect(const Rect: TRect) – очерчивает границы прямоугольника текущей кистью без заполнения; 50
Основные методы класса TCanvas (2) procedure Arc(X 1, Y 1, X 2, Y 2, X 3, Y 3, X 4, Y 4: integer) – чертит дугу эллипса в прямоугольнике (X 1, Y 1, X 2, Y 2), направление – против часовой стрелки; procedure Chord(X 1, Y 1, X 2, Y 2, X 3, Y 3, X 4, Y 4: integer) – чертит сегмент эллипса в прямоугольнике (X 1, Y 1, X 2, Y 2), направление – против часовой стрелки; procedure Pie(X 1, Y 1, X 2, Y 2, X 3, Y 3, X 4, Y 4: integer) – чертит сектор эллипса в прямоугольнике (X 1, Y 1, X 2, Y 2), направление – против часовой стрелки; procedure Round. Rect(X 1, Y 1, X 2, Y 2, X 3, Y 3: integer) – чертит и заполняет прямоугольник с закругленными краями. X 3, Y 3 X 1, Y 1 X 4, Y 4 Центр X 2, Y 2 X 3, Y 3 X 1, Y 1 Центр X 4, Y 4 X 2, Y 2 X 1, Y 1 X 3, Y 3 51 X 2, Y 2
Основные методы класса TCanvas (3) procedure Fill. Rect(const Rect: TRect)– закрашивает кистью прямоугольник, включая левую и верхнюю границы. type TRect = record case Integer of 0: (Left, Top, Right, Bottom: Integer); 1: (Top. Left, Bottom. Right: TPoint); end; procedure Flood. Fill(X, Y: Integer; Color: TColor; Fill. Style: TFill. Style)– type TFill. Style = (fs. Surface, fs. Border); n Fill. Style=fs. Border - заливка области с границей цвета Color; n Fill. Style=fs. Surface - заливка области цвета Color цветом, определенным кистью. 52
Основные методы класса TCanvas (4) procedure Text. Out(X, Y: Integer; const Text: string)– вывод строки текста шрифтом TFont в прямоугольник с верхним левым. углом в точке (X, Y); X, Y ТЕКСТ function Text. Extent(Const Text: String): TSize – возвращает ширину и высоту прямоугольника, охватывающего текстовую строку Text; function Text. Width(Const Text: string): Integer – возвращает ширину прямоугольника, охватывающего текстовую строку; 53
Компонент Образ (класс TImage) Образ – окно для работы с графикой. Свойства: Auto. Size: Boolean – автоматическое изменение размера компонента в зависимости от размера картинки (при загрузке рисунка); Stretch: Boolean – автоматическое масштабирование рисунка при изменении размеров компонента; Picture: TPicture – свойство-объект картинка (двоичный образ, пиктограмма, графический метафайл); класс включает методы: procedure Load. From. File(const File. Name: string); – загрузка картинки из файла; procedure Save. To. File(const File. Name: string); – сохранение картинки в файле. Canvas: TCanvas – холст; Brush: TBrush – кисть; Pen: TPen – перо; Font: TFont – шрифт. 54
Рисование прямоугольников (Ex 8_2) 55
Модуль Main. Unit unit Main. Unit; interface Uses Windows, Messages, Sys. Utils, Classes, Graphics, Controls, Forms, Dialogs, Std. Ctrls, Ext. Ctrls; type TMain. Form = class(TForm) Image: TImage; Exit. Button: TButton; procedure Form. Activate(Sender: TObject); procedure Image. Mouse. Down(Sender: TObject; Button: TMouse. Button; Shift: TShift. State; X, Y: Integer); procedure Image. Mouse. Move(Sender: TObject; Shift: TShift. State; X, Y: Integer); procedure Image. Mouse. Up(Sender: TObject; Button: TMouse. Button; Shift: TShift. State; X, Y: Integer); procedure Exit. Button. Click(Sender: TObject); 56 end;
Модуль Main. Unit (2) var Main. Form: TMain. Form; implementation Var Rect: TRect; first: boolean; {$R *. DFM} procedure TMain. Form. Activate(Sender: TObject); begin Image. Canvas. Brush. Color: =cl. White; end; procedure TMain. Form. Image. Mouse. Down(Sender: TObject; Button: TMouse. Button; Shift: TShift. State; X, Y: Integer); begin if Button=mb. Left then begin Rect. Left: =x; Rect. Top: =y; first: =true; end; 57
Модуль Main. Unit (3) procedure TMain. Form. Image. Mouse. Move(Sender: TObject; Shift: TShift. State; X, Y: Integer); begin if ss. Left in Shift then begin if first then first: =not first else begin Image. Canvas. Pen. Color: =cl. White; Image. Canvas. Rectangle(Rect. Left, Rect. Top, Rect. Right, Rect. Bottom); end; Rect. Right: =X; Rect. Bottom: =Y; Image. Canvas. Pen. Color: =cl. Black; Image. Canvas. Rectangle(Rect. Left, Rect. Top, Rect. Right, Rect. Bottom); end; 58
Модуль Main. Unit (4) procedure TMain. Form. Image. Mouse. Up(Sender: TObject; Button: TMouse. Button; Shift: TShift. State; X, Y: Integer); begin if Button=mb. Left then begin Image. Canvas. Pen. Color: =cl. White; Image. Canvas. Rectangle(Rect. Left, Rect. Top, Rect. Right, Rect. Bottom); Rect. Right: =X; Rect. Bottom: =Y; Image. Canvas. Brush. Color: =cl. Red; Image. Canvas. Fill. Rect(Rect); Image. Canvas. Brush. Color: =cl. White; Image. Canvas. Pen. Color: =cl. Black; end; procedure TMain. Form. Exit. Button. Click(Sender: TObject); begin Close; end; 59 end.
8. 7 Три составляющих движения объекта на плоскости 1 Перемещение x 1 = x + dx, y 1 = y + dy 60 2 Масштабирование относительно точки C (xc, yc): 3 Поворот относительно точки С(xc, yc): x 1 = (x - xc)*Mx +xc, y 1 = (y - yc)*My +yc x 1 = (x - xc)cos + + (y - yc)sin + xc, y 1 = (y - yc)cos - (x - xc)sin + yc
Вращение фигур (Ex 9_01) 61
Объектная декомпозиция Главное окно Активизировать Создать Перерисовать Линия Квадрат h (x, y) h*cos 62 h*sin Шарик dx = h*cos dy = h*sin
Диаграмма классов предметной области TObject TFigure -x, y, halflen, -dx, dy, -Image -Draw() -Rel() +Create() +Move() TLine TSquare TCircle -r -Draw() 63 -Draw() +Create() -Draw()
Модуль Figure Unit Figure; Interface Uses graphics, Ext. Ctrls; Type TFigure=Class x, y, halflen, dx, dy: integer; Image: TImage; constructor Create(ax, ay, ah: integer; a. Image: TImage); procedure Move(t: single); procedure Draw; virtual; abstract; procedure Rel(t: real); end; TLine=Class(TFigure) procedure Draw; override; end; TSquare=Class(TFigure) procedure Draw; override; end; TCircle=Class(TFigure) r: integer; constructor Create(ax, ay, ah, ar: integer; a. Image: TImage); procedure DRAW; override; 64 end;
Модуль Figure (2) Implementation Constructor TFigure. Create; Begin inherited Create; x: =ax; y: =ay; halflen: =ah; Image: =a. Image; End; Procedure TFigure. Rel; Begin dx: =round(halflen*cos(t)); dy: =round(halflen*sin(t)); End; Procedure TFigure. Move; Begin Image. Canvas. Pen. Color: =cl. White; Draw; Image. Canvas. Pen. Color: =cl. Black; Rel(t); Draw; End; 65
Модуль Figure (3) (x-dx, y-dy) Procedure TLine. Draw; (x, y) Begin Image. Canvas. Move. To(x+dx, y+dy); Image. Canvas. Line. To(x-dx, y-dy); (x+dx, y+dy) End; Procedure TSquare. Draw; Begin Image. Canvas. Move. To(x+dx, y+dy); (x-dx, y-dy) (x+dy, Image. Canvas. Line. To(x-dy, y+dx); y-dx) Image. Canvas. Line. To(x-dx, y-dy); Image. Canvas. Line. To(x+dy, y-dx); (x, y) Image. Canvas. Line. To(x+dx, y+dy); (x-dy, y+dx) End; (x+dx, y+dy) Constructor TCircle. Create; Begin inherited Create(ax, ay, ah, a. Image); r: =ar; End; Procedure TCircle. Draw; Begin Image. Canvas. Ellipse(x+dx+r, y+dy+r, x+dx-r, y+dy-r); End; 66 end.
Процедура организации движения procedure TMain. Form. Begin. Button. Click(Sender: TObject); begin L: =TLine. Create(60, 100, 50, Image); S: =TSquare. Create(180, 100, 50, Image); C: =TCircle. Create(300, 100, 50, 10, Image); repeat L. Move(t); S. Move(-0. 2*t); C. Move(0. 5*t); t: =t+0. 01; Application. Process. Messages; {проверить очередь!} until not Moving; Close; end; procedure TMain. Form. End. Button. Click(Sender: TObject); begin Moving: =false; end; 67