МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
Національний університет «Львівська політехніка»
Інститут комп’ютерних наук та інформаційних технологій
Кафедра САПР
Звіт з виконання
Лабораторна робота №3
на тему:
ГРАФІЧНІ ФУНКЦІЇ WINDOWS-ІНТЕРФЕЙСА (WinAPI) ЗАСОБАМИ BORLAND PASCAL 7.0 FOR WINDOWS ТА BORLAND DELPHI
з курсу:
«Геометричне моделювання у конструюванні інженерних об’єктів і систем»
Львів 2010
Мета роботи
Ознайомлення та практичне освоєння технології й основ роботи з графічними можливостями Windows-інтерфейсу (WinAPI) операційного середовища Windows, що можуть викликати прикладними програмами. Вивчити основні графічні функції та процедури WinAPI (Win32API) засобами програмного середовища Borland Pascal 7.0 for Windows та візуального середовища програмування Borland Delphi, набути практичних навиків переходу з програмування графіки для операційної системи DOS до оволодіння принципами створення Windows-програм, розробки графічних процедур та програм WinAPI.
Теоретичні відомості
Налаштування параметрів середовища Borland Pascal for Windows.
При розробці програми з використанням графічних процедур та функцій у середовищі Borland Pascal for Windows необхідно вказати шлях до директорії у якій знаходяться програмні модулі. Для цього необхідно зайти в головне меню середовища (клавішею F10 або вибрати команду меню чи підменю можна використовуючи маніпулятор типу «миша»; якщо миша відсутня, то треба активізувати клавіші ALT + перша літера команди меню, або клавіші, які вказані в конкретній команді підменю). Головне меню середовища складається з десяти підменю.
Принципи організації програм для DOS і для Windows.
DOS є однозадачною операційною системою. Програма, що виконується в середовищі DOS, керується потоком даних. Після ініціалізації (запуску програми) перша програмна процедура виробляє дані, і в залежності від їхнього змісту виробляється виконання наступної процедури, що знову генерує дані і так далі. При визначених даних виробляється де ініціалізація програми.
Windows є багатозадачною операційною системою і по суті не може керуватися потоком даних. Після ініціалізації (запуску) програми керування одержує не яка-небудь робоча процедура цієї програми, а диспетчер подій.
Подія в термінах Windows розуміється як факт здійснення елементарної дії, від якого може залежати хід виконання програми. Це, проміром, натискання клавіші, переміщення курсору миші, завершення визначеного часового інтервалу.
Дії, виконувані диспетчером подій:
а) одержання (фіксація) події;
б) перевірка умови виходу з програми;
в) вибір потрібної процедури обробки події (диспетчитування).
Коли обрана процедура завершує роботу, керування знову повертається диспетчеру подій. При фіксації події, що завершує програму, диспетчер завершує свою роботу і передає керування процедурі деініціалізації.
Перевагою такої схеми керування ходом програми є універсальність. При модернізації програм для введення нової реакції на подію, що вводиться в програму, потрібно лише додати процедуру обробки цієї події без порушення базового коду програми. Для цього всі події в Windows приводяться до стандартного виду визначеної структури (повідомленню).
Widows API: Склад і найменування.
Терміном API (Application Programming Interface) називають інтерфейс прикладної програми Windows. Це повний набір процедур і функцій операційного середовища Windows, що можуть викликатися прикладними програмами під час їхньої роботи. У Borland Pascal ці процедури і функції представлені в TPW-модулях. Найбільше використовується з них модулів модуль Win Types (визначення констант і типів даних) та Win Procs (стандартні процедури і функції Windows).
Windows API включає близько 1000 функцій, і для полегшення орієнтування в них прийнято дотримувати так званої угорської нотації – угоди про принципи іменування функцій, змінних і констант у Windows. Процедури і функції іменуються в стилі «дієслово-іменник», наприклад GreateWindow, SendMessage, TextOut (на відміну від OutText у Dos). Об’єкти і дескриптори.
Windows-програми засновані на об’єктній технології – вікна, меню, піктограми, блоки діалогу, таймер, інструменти для малювання та інші елементи створюються і керуються як об’єкти. Сама програма розглядається середовищем Windows також як об’єкт.
Об’єктів досить багато, і для їхнього однозначного визначення існують дескриптори (чи посилання – термін «Handle»). Дескриптор можна розглядати як індекс об’єкта в системному списку об’єктів Windows. Він визначений як 16-бітне слово в модулі WinTypes (Type Handle-Word). Подібна адресація об’єктів знімає обмеження й умовності при взаємодії з апаратним забезпеченням і не вимагає зміни коду програм при удосконалюванні самої Windows.
Лабораторне завдання
Ознайомитись з графічними функціями WinAPI.
Створити алгоритм розв’язку індивідуального завдання.
Скласти програму на мові Pascal з використанням функцій WinAPI, набрати у текстовому редакторі інтегрованого середовища Borland Pascal for Windows чи Borland Delphi.
Записати створену програму на диск.
Запустити на виконання програму.
Отримати результати виконання програми згідно індивідуального завдання.
Здійснити аналіз результатів та сформувати висновки по роботі.
Оформити результати по роботі.
Індивідуальне завдання
Варіант №28
Написати програму із застосуванням графічних функцій WinAPI, яка дозволяє візуалізувати графік(и) функції з можливостями масштабування у вікні на певному інтервалі. Застосувати функції зміни кольору, штриховки, зафарбування замкнутих областей, текстових підписів, виводу координатної сітки. Організувати вивід графіки у зовнішній метафайл.
Побудувати в одній області екрана графіки функцій і.
Текст програми
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls, Buttons;
type
TForm1 = class(TForm)
Image1: TImage;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
Label6: TLabel;
ComboBox3: TComboBox;
TrackBar1: TTrackBar;
Label2: TLabel;
Label1: TLabel;
procedure BitBtn2Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure BitBtn1Click(Sender: TObject) procedure ComboBox1Change(Sender: TObject);
procedure ComboBox2Change(Sender: TObject);
procedure ComboBox3Change(Sender: TObject);
private
public
end;
{----------------Опис змінних---------------------}
var
Form1: TForm1;
k,f,x,y,rx,ry,kd,fd:integer;
colGr1,colGr2,colAx:TColor;
implementation
{-----------Процедура малювання фону------}
Procedure FonDraw;
Begin
Form1.Image1.Canvas.FillRect(Rect(0,0,Form1.Image1.Width,Form1.Image1.Height));
End;
{---------------------------------------------}
Procedure DrawAxes;
Begin
k:=Form1.TrackBar1.Position;
Form1.Image1.Canvas.Pen.Color:=colAx;
Form1.Image1.Canvas.MoveTo(0,Trunc(Form1.Image1.Height/2));
Form1.Image1.Canvas.LineTo(Form1.Image1.Width,Trunc(Form1.Image1.Height/2));
Form1.Image1.Canvas.MoveTo(Trunc(Form1.Image1.Width/2),0);
Form1.Image1.Canvas.LineTo(Trunc(Form1.Image1.Width/2),Form1.Image1.Height);
Form1.Image1.Canvas.Pen.Color:=clSilver;
x:=Trunc(Form1.Image1.Width/2);
while x<Form1.Image1.Width do
begin
x:=x+k;
Form1.Image1.Canvas.MoveTo(x,0);
Form1.Image1.Canvas.LineTo(x,Form1.Image1.Height);
end;
x:=Trunc(Form1.Image1.Width/2);
while x>0 do
begin
x:=x-k;
Form1.Image1.Canvas.MoveTo(x,0);
Form1.Image1.Canvas.LineTo(x,Form1.Image1.Height);
end;
y:=Trunc(Form1.Image1.Height/2);
while y<Form1.Image1.Height do
begin
y:=y+k;
Form1.Image1.Canvas.MoveTo(0,y);
Form1.Image1.Canvas.LineTo(Form1.Image1.Width,y);
end;
y:=Trunc(Form1.Image1.Height/2);
while y>0 do
begin
y:=y-k;
Form1.Image1.Canvas.MoveTo(0,y);
Form1.Image1.Canvas.LineTo(Form1.Image1.Width,y);
end;
End;
{--------------------Перша функція---------------}
Function fy1(fx:integer):real;
Begin
fy1:=sqrt(sqr(fx)+2)*sin(fx)
End;
{----------------------Друга функція--------------}
Function fy2(fx:integer):real;
Begin
fy2:=(fx+1)*sin(fx);
End;
{----------------------Малювання графіка-------}
Procedure Grafic(pg:integer);
Begin
if pg=1 then
begin
FonDraw;
DrawAxes
end
else if pg=2 then
begin
Form1.Image1.Canvas.Pen.Color:=colGr1;
rx:=0;
ry:=Trunc(fy1(rx));
x:=Trunc(Form1.Image1.Width/2)+k*rx;
y:=Trunc(Form1.Image1.Height/2)-k*ry;
Form1.Image1.Canvas.MoveTo(x,y);
while x<Form1.Image1.Width do
begin
rx:=rx+1;
ry:=Trunc(fy1(rx));
x:=Trunc(Form1.Image1.Width/2)+k*rx;
y:=Trunc(Form1.Image1.Height/2)-k*ry;
Form1.Image1.Canvas.LineTo(x,y);
end;
rx:=0;
ry:=Trunc(fy1(rx));
x:=Trunc(Form1.Image1.Width/2)+k*rx;
y:=Trunc(Form1.Image1.Height/2)-k*ry;
Form1.Image1.Canvas.MoveTo(x,y);
while x>0 do
begin
rx:=rx-1;
ry:=Trunc(fy1(rx));
x:=Trunc(Form1.Image1.Width/2)+k*rx;
y:=Trunc(Form1.Image1.Height/2)-k*ry;
Form1.Image1.Canvas.LineTo(x,y);
End end
else if pg=3 then
begin
Form1.Image1.Canvas.Pen.Color:=colGr2;
rx:=0;
ry:=Trunc(fy2(rx));
x:=Trunc(Form1.Image1.Width/2)+k*rx;
y:=Trunc(Form1.Image1.Height/2)-k*ry;
Form1.Image1.Canvas.MoveTo(x,y);
while x<Form1.Image1.Width do
begin
rx:=rx+1;
ry:=Trunc(fy2(rx));
x:=Trunc(Form1.Image1.Width/2)+k*rx;
y:=Trunc(Form1.Image1.Height/2)-k*ry;
Form1.Image1.Canvas.LineTo(x,y);
end;
rx:=0;
ry:=Trunc(fy2(rx));
x:=Trunc(Form1.Image1.Width/2)+k*rx;
y:=Trunc(Form1.Image1.Height/2)-k*ry;
Form1.Image1.Canvas.MoveTo(x,y);
while x>0 do
begin
rx:=rx-1;
ry:=Trunc(fy2(rx));
x:=Trunc(Form1.Image1.Width/2)+k*rx;
y:=Trunc(Form1.Image1.Height/2)-k*ry;
Form1.Image1.Canvas.LineTo(x,y);
end end End;
{-----------------------Вибір функції-------------}
Procedure func;
Begin
if Form1.RadioButton2.Checked then f:=2
else if Form1.RadioButton3.Checked then f:=3;
case f of
2:Grafic(2);
3:Grafic(3);
end;
End;
{-------------------Кнопка очистки екрану--- }
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
FonDraw;
DrawAxes
end;
{------------------------------------------------------}
procedure TForm1.FormActivate(Sender: TObject);
begin
colGr1:=clBlue;
colGr2:=clDefault;
colAx:=clRed;
FonDraw;
DrawAxes;
end;
{--------------------Масштабування--------------}
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
FonDraw;
DrawAxes;
func
end;
{-------------Кнопка малювання графіка-----}
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
FonDraw;
DrawAxes;
func
end;
{---------Вибір кольору першого графіка-----}
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
if Form1.ComboBox1.Text='Red' then colGr1:=clRed
else if Form1.ComboBox1.Text='Lime' then colGr1:=clLime
else if Form1.ComboBox1.Text='Yellow' then colGr1:=clYellow
else if Form1.ComboBox1.Text='Blue' then colGr1:=clBlue
else if Form1.ComboBox1.Text='Fuchsia' then colGr1:=clFuchsia
else if Form1.ComboBox1.Text='Aqua' then colGr1:=clAqua
else if Form1.ComboBox1.Text='White' then colGr1:=clWhite
else if Form1.ComboBox1.Text='Default' then colGr1:=clDefault;
end;
{---------Вибір кольору другого графіка-}
procedure TForm1.ComboBox2Change(Sender: TObject);
begin
if Form1.ComboBox2.Text='Red' then colGr2:=clRed
else if Form1.ComboBox2.Text='Lime' then colGr2:=clLime
else if Form1.ComboBox2.Text='Yellow' then colGr2:=clYellow
else if Form1.ComboBox2.Text='Blue' then colGr2:=clBlue
else if Form1.ComboBox2.Text='Fuchsia' then colGr2:=clFuchsia
else if Form1.ComboBox2.Text='Aqua' then colGr2:=clAqua
else if Form1.ComboBox2.Text='White' then colGr2:=clWhite
else if Form1.ComboBox2.Text='Default' then colGr2:=clDefault;
end;
{-----Вибір кольору координатних осей-----}
procedure TForm1.ComboBox3Change(Sender: TObject);
begin
if Form1.ComboBox3.Text='Red' then colAx:=clRed
else if Form1.ComboBox3.Text='Lime' then colAx:=clLime
else if Form1.ComboBox3.Text='Yellow' then colAx:=clYellow
else if Form1.ComboBox3.Text='Blue' then colAx:=clBlue
else if Form1.ComboBox3.Text='Fuchsia' then colAx:=clFuchsia
else if Form1.ComboBox3.Text='Aqua' then colAx:=clAqua
else if Form1.ComboBox3.Text='White' then colAx:=clWhite
else if Form1.ComboBox3.Text='Default' then colAx:=clDefault;
end;
end.
Результати виконання програми
Рис. 1. Графік першої функції
Рис. 2. Графік другої функції
Висновок
На цій лабораторній роботі, я ознайомився з графічними можливостями мови Turbo Pascal версії 7.0. Вивчив графічні функції та процедури програмного середовища Turbo Pascal, набув практичних навиків розробки графічних процедур у середовищі Turbo Pascal в текстовому та графічному режимах. Написав програму на мові програмування Pascal, згідно індивідуального завдання. Переконався, що вона працює і виводить коректний результат. Привів у звіті результати виконання програми.