Міністерство освіти та науки України
Національний університет “Львівська політехніка”
Кафедра САП
ЛАБОРАТОРНІ РОБОТИ № 1, 2, 3
з курсу: “Адміністрування САПР”
на тему: „Створення компоненту бібліотеки засобами графічного редактора Symbol Editor, Pattern Editor, Library Executive та схеми електричної принципової редактором Shematic”
Львів - 2005
МЕТА РОБОТИ
ТЕОРЕТИЧНІ ВІДОМОСТІ
3. ІНДИВІДУАЛЬНЕ ЗАВДАННЯ
ТЕКСТ ПРОГРАМИ
program TPMark3;
uses
SysUtils,
Windows,
Messages;
var
wc : TWndClassEx; // Зміна шаблону класу вікна.
MainWnd : HWND; // Описувач головного вікна.
Mesg : TMsg; // Змінна для циклу збора повідомлень.
xPos, yPos, nWidth, nHeight : Integer;
MyDC, WMFDC, OldDC : HDC; // Контекст пристрою.
zoom : Integer; // Масштаб (по замовчуванню 100).
brush : HBrush;
// Координати початків координат для всіх графіків.
ox1, oy1, ox2, oy2, ox3, oy3, ox4, oy4, ox5, oy5, ox6, oy6 : integer;
MFile : HMetaFile; // Дескриптор метафайлу.
count : integer; // Допоміжна змінна.
rec : TRect; // Область вікна для малювання.
prec : PRect; // Область для метафайлу.
// Віконна процедура головного вікна.
function WindowProc(wnd : HWND; Msg : Integer; Wparam : Wparam; Lparam : Lparam) : Lresult;
stdcall;
Begin
// Далі проходить цикл обробки повідомлень.
case msg of
wm_destroy :
// Повідомленні, яке надсилається при знищенні вікна.
begin
postquitmessage(0);
exit;
Result := 0;
end
else Result := DefWindowProc(wnd, msg, wparam, lparam);
end;
end;
//---------------------------------------------------------------------------
// Процедура побудови графіка функції, з використанням ліній.
procedure DrawGraphicWithLines(ox, oy, zoom : integer; A, B, krok : double; color : longint);
var
x, y : integer;
Fi, Ro : double;
pen : HPen;
begin
pen := CreatePen(ps_Solid, 2, color);
SelectObject(MyDC, pen);
Fi := 0;
Ro := A*sin(B*Fi);
x := Round(Ro*cos(Fi)*zoom) + ox;
y := Round(Ro*sin(Fi)*zoom) + oy;
MoveToEx(MyDC, x, y, nil);
Fi := Fi + krok;
repeat
Ro := A*sin(B*Fi);
x := Round(Ro*cos(Fi)*zoom) + ox;
y := Round(Ro*sin(Fi)*zoom) + oy;
LineTo(MyDC, x, y);
Fi := Fi + krok;
until Fi > 12.5;
DeleteObject(pen);
end;
//---------------------------------------------------------------------------
// Процедура побудови графіка функції, з використанням точок.
procedure DrawGraphicWithPoints(ox, oy, zoom : integer; A, B, krok : double; color : longint);
var
x, y : integer;
Fi, Ro : double;
begin
Fi := 0;
repeat
Ro := A*sin(B*Fi);
x := Round(Ro*cos(Fi)*zoom) + ox;
y := Round(Ro*sin(Fi)*zoom) + oy;
SetPixel(MyDC, x, y, color);
Fi := Fi + krok;
until Fi > 12.5;
end;
//---------------------------------------------------------------------------
// Процедура побудови координатних осей.
procedure DrawOsi(ox, oy, zoom : integer);
Var
pen : HPen;
brush : HBrush;
point : array [1..5] of TPoint;
begin
// 1. Створуємо перо.
pen := CreatePen(ps_Solid, 2, RGB(0, 0, 0));
SelectObject(MyDC, pen);
// 2. Створюємо пензлик.
brush := CreateSolidBrush(RGB(0, 0, 0));
SelectObject(MyDC, brush);
SetBkMode(MyDc, 1); // Робимо прозорий фон.
// 3. Малюємо осі координат.
MoveToEx(MyDC, ox - zoom - 30, oy, nil);
LineTo(MyDC, ox + zoom + 30, oy); // Малюємо OX.
MoveToEx(MyDC, ox, oy + zoom + 30, nil);
LineTo(MyDC, ox, oy - zoom - 30); // Малюємо OY.
// 4. Малюємо стрілку для осі OX.
point[1].X := ox + zoom + 33;
point[1].Y := oy - 1;
point[2].X := ox + zoom + 13;
point[2].Y := oy + 4;
point[3].X := ox + zoom + 23;
point[3].Y := oy - 1;
point[4].X := ox + zoom + 13;
point[4].Y := oy - 5;
point[5].X := ox + zoom + 33;
point[5].Y := oy - 1;
Polygon(MyDC, point, 4);
// 5. Малюємо стрілку для осі OY.
point[1].X := ox - 1;
point[1].Y := oy - zoom - 33;
point[2].X := ox - 5;
point[2].Y := oy - zoom - 13;
point[3].X := ox;
point[3].Y := oy - zoom - 23;
point[4].X := ox + 4;
point[4].Y := oy - zoom - 13;
point[5].X := ox - 1;
point[5].Y := oy - zoom - 33;
Polygon(MyDC, point, 4);
// 6. Виводимо назви осей.
TextOut(MyDc, ox + zoom + 30, oy + 4, 'X', 1);
TextOut(MyDc, ox + 4, oy - zoom - 40, 'Y', 1);
// 7. Знищуємо об'єкти.
DeleteObject(brush);
DeleteObject(pen);
end;
//---------------------------------------------------------------------------
// Процедура побудови координатної сітки.
procedure DrawGrid(ox, oy, zoom : integer);
Var
pen : HPen;
x, y, krok : integer;
begin
pen := CreatePen(ps_Dot, 1, RGB(0, 0, 0));
SelectObject(MyDC, pen);
SetBkMode(MyDc, 1); // Робимо прозорий фон.
krok := 40;
y := oy + krok;
while y <= oy + zoom + 30 do
begin
MoveToEx(MyDC, ox - zoom - 30, y, nil);
LineTo(MyDC, ox + zoom + 30, y);
y := y + krok;
end;
y := oy - krok;
while y >= oy - zoom - 30 do
begin
MoveToEx(MyDC, ox - zoom - 30, y, nil);
LineTo(MyDC, ox + zoom + 30, y);
y := y - krok;
end;
x := ox - krok;
while x >= ox - zoom - 30 do
begin
MoveToEx(MyDC, x, oy + zoom + 30, nil);
LineTo(MyDC, x, oy - zoom - 30);
x := x - krok;
end;
x := ox + krok;
while x <= ox + zoom + 30 do
begin
MoveToEx(MyDC, x, oy + zoom + 30, nil);
LineTo(MyDC, x, oy - zoom - 30);
x := x + krok;
end;
DeleteObject(pen);
end;
//---------------------------------------------------------------------------
begin
// Далі йде заповнення шаблону класу вікна.
wc.cbSize := sizeof(wc);
wc.style := cs_hredraw or cs_vredraw;
wc.lpfnWndProc := @WindowProc;
wc.cbClsExtra := 0;
wc.cbWndExtra := 0;
wc.hInstance := HInstance;
wc.hIcon := LoadIcon(0, idi_application);
wc.hCursor := LoadCursor(0, idc_arrow);
wc.hbrBackground := COLOR_BTNFACE + 1;
wc.lpszMenuName := nil;
wc.lpszClassName := 'WinMin: Main';
RegisterClassEx(wc); // Реєстрація нового класу в системі.
// Заповнення зменних xPos, yPos, nWidth, nHeight.
xPos := 0;
yPos := 0;
nWidth := 1024;
nHeight := 739;
// Створення головного вікна.
MainWnd := CreateWindowEx(0, // Прапорці розширених стилів.
'WinMin: Main', // Ім'я класу вікна, яке задане при заповненні структури wc.
'Маркелов - Лабораторна робота 3 (виконав Паранчак Т. М.).', // Заголовок вікна.
ws_overlappedwindow, // Прапорці стилів вікна.
xPos, // Горизонтальна позиція вікна.
yPos, // Вертикальна позиція вікна.
nWidth, // Ширина вікна.
nHeight, // Висота вікна.
0, // Описувач батьківського вікна (parent) чи вікна-володаря (owner).
0, // Описувач меню вікна (меню нема, нема і описувача).
Hinstance, // Описувач програми (application).
nil); // Address of window-creation data.
ShowWindow(MainWnd, CmdShow); // Відображуємо вікно.
// Задання початкових значень.
count := 0;
zoom := 100;
ox1 := 150;
oy1 := 170;
ox2 := 500;
oy2 := 170;
ox3 := 850;
oy3 := 170;
ox4 := 150;
oy4 := 520;
ox5 := 500;
oy5 := 520;
ox6 := 850;
oy6 := 520;
GetClientRect(MainWnd, rec);
new(prec);
prec.Left := rec.Left;
prec.Top := rec.Top;
prec.Right := rec.Right;
prec.Bottom := rec.Bottom;
// Цикл обробки повідомлень. Він може трохи видозмінюватися, але цей код присутній завжни.
While GetMessage(Mesg,0,0,0) do
begin
TranslateMessage(Mesg);
DispatchMessage(Mesg);
// Робота з графічними функціями.
MyDC:=GetDC(MainWnd); // Отримання контексту пристрою виводу.
SaveDC(OldDC);
// ************************ Мій власний код. ***************************
if (Mesg.message = 256) or (Mesg.message = 15) or (Mesg.message = 49366) then
begin
if (count = 0) or (count >= 3) then
begin
Rectangle(MyDC, xPos, yPos, nWidth, nHeight);
// 1. Натиснення '+'.
if (Mesg.message = 256) and (Mesg.wParam = 107) then
begin
Rectangle(MyDC, xPos, yPos, nWidth, nHeight);
zoom := zoom + 20;
ox2 := ox2 + (zoom - 100)*2;
ox3 := ox3 + (zoom - 100)*4;
oy4 := oy4 + (zoom - 100)*2;
ox5 := ox5 + (zoom - 100)*2;
oy5 := oy5 + (zoom - 100)*2;
ox6 := ox6 + (zoom - 100)*4;
oy6 := oy6 + (zoom - 100)*2;
end
else if (Mesg.message = 256) and (Mesg.wParam = 109) then
begin
Rectangle(MyDC, xPos, yPos, nWidth, nHeight);
if zoom >= 100 then
begin
ox2 := ox2 - (zoom - 100)*2;
ox3 := ox3 - (zoom - 100)*4;
oy4 := oy4 - (zoom - 100)*2;
ox5 := ox5 - (zoom - 100)*2;
oy5 := oy5 - (zoom - 100)*2;
ox6 := ox6 - (zoom - 100)*4;
oy6 := oy6 - (zoom - 100)*2;
end;
zoom := zoom - 20;
end
else if (Mesg.message = 256) and (Mesg.wParam = 37) then
begin
ox1 := ox1 - 80;
ox2 := ox2 - 80;
ox3 := ox3 - 80;
ox4 := ox4 - 80;
ox5 := ox5 - 80;
ox6 := ox6 - 80;
end
else if (Mesg.message = 256) and (Mesg.wParam = 39) then
begin
ox1 := ox1 + 80;
ox2 := ox2 + 80;
ox3 := ox3 + 80;
ox4 := ox4 + 80;
ox5 := ox5 + 80;
ox6 := ox6 + 80;
end
else if (Mesg.message = 256) and (Mesg.wParam = 38) then
begin
oy1 := oy1 - 80;
oy2 := oy2 - 80;
oy3 := oy3 - 80;
oy4 := oy4 - 80;
oy5 := oy5 - 80;
oy6 := oy6 - 80;
end
else if (Mesg.message = 256) and (Mesg.wParam = 40) then
begin
oy1 := oy1 + 80;
oy2 := oy2 + 80;
oy3 := oy3 + 80;
oy4 := oy4 + 80;
oy5 := oy5 + 80;
oy6 := oy6 + 80;
end
else if (Mesg.message = 256) and (Mesg.wParam = 112) then
begin
// WMFDC := CreateEnhMetaFile(MyDC, 'd:\TPMark3.wmf', prec, nil);
// MFile := CloseEnhMetaFile(WMFDC);
end
else if (Mesg.message = 256) and (Mesg.wParam = 113) then
begin
// PlayEnhMetaFile(WMFDC, MFile, rec);
end;
// 1. Малюємо перший графік.
DrawOsi(ox1+zoom-100, oy1+zoom-100, zoom);
DrawGrid(ox1+zoom-100, oy1+zoom-100, zoom);
DrawGraphicWithPoints(ox1+zoom-100, oy1+zoom-100, zoom, 1, 4, 0.02, RGB(205, 1, 27));
TextOut(MyDc, ox1+zoom-100 - zoom - 20, oy1 + zoom+zoom-100 + 50, 'Рис. 1. Одна функція (A = 1, B = 4).', 37);
// 2. Малюємо другий графік.
DrawOsi(ox2+zoom-100, oy2+zoom-100, zoom);
DrawGrid(ox2+zoom-100, oy2+zoom-100, zoom);
DrawGraphicWithLines(ox2+zoom-100, oy2+zoom-100, zoom, 1, 10, 0.01, RGB(0, 168, 0));
TextOut(MyDc, ox2+zoom-100 - zoom - 20, oy2+zoom-100 + zoom + 50, 'Рис. 2. Одна функція (A = 1, B = 10).', 38);
// 3. Малюємо третій графік.
DrawOsi(ox3+zoom-100, oy3+zoom-100, zoom);
DrawGrid(ox3+zoom-100, oy3+zoom-100, zoom);
DrawGraphicWithLines(ox3+zoom-100, oy3+zoom-100, zoom, 1, 10.5, 0.01, RGB(0, 0, 255));
TextOut(MyDc, ox3+zoom-100 - zoom - 25, oy3+zoom-100 + zoom + 50, 'Рис. 3. Одна функція (A = 1, B = 10.5).', 40);
// 1. Малюємо першу квітку.
DrawGraphicWithLines(ox4+zoom-100, oy4+zoom-100, zoom, 1, 5.5, 0.001, RGB(255, 0, 0));
DrawGraphicWithLines(ox4+zoom-100, oy4+zoom-100, zoom, 0.9, 5.5, 0.01, RGB(255, 100, 0));
DrawGraphicWithLines(ox4+zoom-100, oy4+zoom-100, zoom, 0.8, 5.5, 0.01, RGB(255, 128, 0));
DrawGraphicWithLines(ox4+zoom-100, oy4+zoom-100, zoom, 0.7, 5.5, 0.01, RGB(255, 150, 0));
DrawGraphicWithLines(ox4+zoom-100, oy4+zoom-100, zoom, 0.6, 5.5, 0.01, RGB(255, 150, 0));
DrawGraphicWithLines(ox4+zoom-100, oy4+zoom-100, zoom, 0.5, 5.5, 0.01, RGB(255, 180, 0));
DrawGraphicWithLines(ox4+zoom-100, oy4+zoom-100, zoom, 0.4, 5.5, 0.01, RGB(255, 200, 0));
DrawGraphicWithLines(ox4+zoom-100, oy4+zoom-100, zoom, 0.3, 5.5, 0.01, RGB(255, 220, 0));
DrawGraphicWithLines(ox4+zoom-100, oy4+zoom-100, zoom, 0.2, 5.5, 0.1, RGB(255, 255, 0));
TextOut(MyDc, ox4+zoom-100 - zoom - 40, oy4+zoom-100 + zoom + 10, 'Рис. 4. Девять функцій (A = [0.2; 1], B = 5.5).', 48);
// 2. Малюємо другу квітку.
DrawGraphicWithLines(ox5+zoom-100, oy5+zoom-100, zoom, 1, 3, 0.01, RGB(242, 0, 231));
brush := CreateSolidBrush(RGB(242, 0, 231));
SelectObject(MyDC, brush);
FloodFill(MyDC, ox5+zoom-100, oy5+zoom-100-50, RGB(242, 0, 231));
FloodFill(MyDC, ox5+zoom-100-50, oy5+zoom-100+30, RGB(242, 0, 231));
FloodFill(MyDC, ox5+zoom-100+50, oy5+zoom-100+30, RGB(242, 0, 231));
DeleteObject(brush);
DrawGraphicWithLines(ox5+zoom-100, oy5+zoom-100, zoom, 0.15, 3.5, 0.1, RGB(255, 255, 0));
TextOut(MyDc, ox5+zoom-100 - zoom, oy5+zoom-100 + zoom + 10, 'Рис. 5. Дві функції (A = 1, B = 3', 34);
TextOut(MyDc, ox5+zoom-100 - zoom + 40, oy5+zoom-100 + zoom + 27, 'і A = 0.15; B = 3.5).', 23);
// 3. Малюємо третю квітку.
DrawGraphicWithLines(ox6+zoom-100, oy6+zoom-100, zoom, 1, 16.7, 0.01, RGB(255, 0, 0));
TextOut(MyDc, ox6+zoom-100 - zoom - 25, oy6+zoom-100 + zoom + 10, 'Рис. 6. Одна функція (A = 1, B = 16.7).', 40);
end;
end;
count := count + 1;
// ***********************************************************************
ReleaseDC(MainWnd,OldDC); // Звільнення зсилки.
DeleteDC(MyDC); // Видалення зсилки.
end;
//WMFDC := CreateEnhMetaFile(MyDC, 'd:\TPMark3.wmf', prec, nil);
//MFile := CloseEnhMetaFile(WMFDC);
//DeleteEnhMetaFile(MFile);
end.
РЕЗУЛЬТАТ ВИКОНАННЯ ПРОГРАМИ
ВИСНОВОК
Програмування під операційну систему Windows є досить просте і дає великі можливості, хоча й потребує великих знань про принципи виконання програм та виникнення подій в системі.