DevioLabавтоматичне керування капіталом
ПРАЦЮЄ 24/7
КРИПТОВАЛЮТИ · АКЦІЇ · 10 БІРЖ

Портфель, який керується автоматично

DevioLab підбирає стратегії, відстежує ринки та автоматизує купівлю і продаж активів. Кількість доступних криптовалют, акцій і торгових можливостей зростає щодня.

10підключених біржCrypto + Stocksв одному портфелі24/7автоматичний контроль

Звіт до лабораторної роботи №3 на тему: Графічні функції Windows-інтерфейса (WinAPI)

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Інститут комп’ютерних наук та інформаційних технологій
Факультет:
КН
Кафедра:
Кафедра систем автоматизованого проектування

Інформація про роботу

Рік:
2005
Тип роботи:
Звіт до лабораторної роботи
Предмет:
Моделювання
Група:
КН-31
Коротко про документ

Про що ця робота

У звіті наведено результати виконання лабораторної роботи з програмування графічних функцій WinAPI за допомогою Borland Pascal. Розроблено програму для візуалізації та масштабування графіків функцій і ряду Тейлора у середовищі Windows.

У роботі розглядаються

  • Windows API
  • Borland Pascal
  • Графічні функції
  • Геометричне моделювання
  • Ряд Тейлора
  • Програмування графіки
  • Візуалізація даних

Зміст і розділи

  1. Мета роботи
  2. Теоретичні відомості
  3. Лабораторне завдання
  4. Текст програми
  5. Результати роботи
Для кого:Студенти технічних спеціальностей та вивчаючі системне програмування і WinAPI.
Викладачі:Не вказано

Ключові поняття

WinAPIBorland PascalBorland Delphiметафайлряд Тейлорамасштабуваннядиспетчер подійграфічний контекствікно програми

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки України Національний університет «Львівська політехніка» Кафедра САПР Звіт до лаболаторної роботи №3 На тему ГРАФІЧНІ ФУНКЦІЇ WINDOWS-ІНТЕРФЕЙСА (WinAPI) ЗАСОБАМИ BORLAND PASCAL 7.0 FOR WINDOWS ТА BORLAND DELPHI З курсу:Геометричне моделювання в САПР Львів 2005 1. МЕТА РОБОТИ Мета роботи – ознайомлення та практичне освоєння технології й основ роботи з графічними можливостями Windows-інтерфейсу (WinAPI) операційного середовища Wіndows,що можуть викликатися прикладними програмами. Вивчити основні графічні функцій та процедури WinAPI (Win32API) засобами програмного середовища Borland Pascal 7.0 for Windows та візуального середовища програмування Borland Delphi, набути практичних навиків переходу з програмування графіки для операційної системи DOS до оволодіння принципами створення Wіndows-программ, розробки графічних процедур та програм WinAPI. 2. ТЕОРЕТИЧНІ ВІДОМОСТІ НА ЛАШТУВАННЯ ПАРАМЕТРІВ СЕРЕДОВИЩА BORLAND PASCAL FOR WINDOWS  Рис. 1 Основні елементи віконної оболонки Borland Pascal 7.0 for Window 2.2. ПРИНЦИПИ ОРГАНІЗАЦІЇ ПРОГРАМ ДЛЯ DOS І ДЛЯ WІNDOWS DOS є однозадачной операційною системою. Програма, що виконується в середовищі DOS, керується потоком даних. Після ініціалізації (запуску програми) перша програмна процедура виробляє дані, і в залежності від їхнього змісту виробляється виконання наступної процедури, що знову генерує дані і так далі (рис. 3). При визначених даних виробляється деініціалізація програми.  Рис.3 Схема обробки задач у DOS Wіndows є багатозадачною операційною системою і по суті не може керуватися потоком даних. Після ініціалізації (запуску) програми керування одержує не яка-небудь робоча процедура цієї програми, а диспетчер подій. Подія в термінах Wіndows розуміється як факт здійснення елементарної дії, від якого може залежати хід виконання програми. Це, приміром, натискання клавіші, переміщення курсору миші, завершення визначеного часового інтервалу. Дії, виконувані диспетчером подій: а) одержання (фіксація) події; б) перевірка умови виходу з програми; в) вибір потрібної процедури обробки події (диспетчирування). Коли обрана процедура завершує роботу, керування знову повертається диспетчеру подій (рис. 4). При фіксації події, що завершує програму, диспетчер завершує свою роботу і передає керування процедурі деініціалізації.  Рис.4 Схема обробки задач у Windows Перевагою такої схеми керування ходом програми є універсальність. При модернізації програм для введення нової реакції на подію, що вводиться в програму, потрібно лише додати процедуру обробки цієї події без порушення базового коду програми. Для цього всі події в Wіndows приводяться до стандартного виду визначеної структури (повідомленню). Лаболаторне завдання Написати програму із застосуванням графічних функцій WinAPI, яка дозволяє візуалізувати графік(и) функції з можливостями масштабування у вікні на певному інтервалі. Застосувати функції зміни кольору, штриховки, зафарбування замкнутих областей, текстових підписів, виводу координатної сітки. Організувати вивід графіка у зовнішній метафайл. Побудувати в одній області екрана графіки функцій Y(x) і YN(x). Графік функції YN(x) будується для трьох і чотирьох членів розкладання функції Y(х) у ряд Тейлора. Y(x)= (1+x)m; Y3(x)=1 +mx+ m(m -1)x2/2!; Y4(x)= 1 +mx+ m(m -1)x2/2! + m (m-1)(m-2)x3/3!; х=[-0.9..0.9]; Текст програми: program laba; {$APPTYPE CONSOLE} uses windows, WinTypes, WinProcs, messages; var wc : TWndClassEx; MainWnd : HWND; Mesg: TMsg; xPos, yPos, nWidth, nHeight: Integer; MyDc: hDC; rec : TRect; MyBrushHandle: HBRUSH; Pen1Graffic, Pen2Graffic, Pen3Graffic: hPen; xVisj, yVisj, part_count, curent_part : integer; xStartInterval, xEndInterval, part_interval_koor, part_interval_num, part_interval_koor_y : real; x, y, y3,y4, dx, maschtab : real; help : string; 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 draw_y; begin x := xStartInterval; SelectObject(myDC, Pen1Graffic); y := sqrt(1+x); moveToEX(MyDc, round(yvisj + (x*maschtab)), round(xvisj - (y*(maschtab/12))), nil); repeat y := sqrt(1+x); LineTo(MyDc, round(yvisj + (x*maschtab)), round(xvisj - (y*(maschtab/12)))); moveToEX(MyDc, round(yvisj + (x*maschtab)), round(xvisj - (y*(maschtab/12))), nil); x := x +dx; until x > xEndInterval; end; procedure draw_y3; begin x := xStartInterval; SelectObject(myDC, Pen2Graffic); y3 := 1 + 0.5*x + (0.5*(-0.5)*sqr(x))/2; moveToEX(MyDc, round(yvisj + (x*maschtab)), round(xvisj - (y3*(maschtab/12))), nil); repeat y3 := 1 + 0.5*x + (0.5*(-0.5)*sqr(x))/2; LineTo(MyDc, round(yvisj + (x*maschtab)), round(xvisj - (y3*(maschtab/12)))); moveToEX(MyDc, round(yvisj + (x*maschtab)), round(xvisj - (y3*(maschtab/12))), nil); x := x +dx; until x > xEndInterval; end; procedure draw_y4; begin x := xStartInterval; SelectObject(myDC, Pen3Graffic); y4 := 1 + 0.5*x + (0.5*(-0.5)*sqr(x))/2 + (0.5*(-0.5)*(-1.5)*x*x*x)/6; moveToEX(MyDc, round(yvisj + (x*maschtab)), round(xvisj - (y4*(maschtab/12))), nil); repeat y4 := 1 + 0.5*x + (0.5*(-0.5)*sqr(x))/2 + (0.5*(-0.5)*(-1.5)*x*x*x)/6; LineTo(MyDc, round(yvisj + (x*maschtab)), round(xvisj - (y4*(maschtab/12)))); moveToEX(MyDc, round(yvisj + (x*maschtab)), round(xvisj - (y4*(maschtab/12))), nil); x := x +dx; until x > xEndInterval; end; begin { TODO -oUser -cConsole Main : Insert code here } {write('input interval from x = '); readln(xStartInterval); write(' to x ='); readln(xEndInterval); write('input count subInterval: '); readln(part_count); write('Input step of x: '); readln(dx);} xStartInterval := -0.9; xEndInterval := 0.9; part_count := 18; dx := 0.01; MyBrushHandle := CreateSolidBrush(RGB(255,255,255)); 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 := MyBrushHandle; wc.lpszMenuName := nil; wc.lpszClassName := 'WinMin : Main'; RegisterClassEx(wc); Pen1Graffic := CreatePen(PS_SOLID, 1, rgb(255,0,0)); Pen2Graffic := CreatePen(PS_DASH, 1, rgb(0, 255, 0)); Pen3Graffic := CreatePen(PS_DOT, 1, rgb(0,0,255)); xPos := 100; yPos := 150; nWidth := 400; nHeight := 250; part_interval_num := (xEndInterval - xStartInterval)/part_count; MainWnd := CreateWindowEx(0, 'WinMin : Main', 'Ëàáîðàòîðíà ðîáîòà ¹3: Windows API', ws_overlappedwindow, xPos, yPos, nWidth, nHeight, 0, 0, Hinstance, nil); ShowWindow(MainWnd, sw_ShowMaximized); While GetMessage(Mesg, 0,0,0) do begin TranslateMessage(Mesg); DispatchMessage(Mesg); GetClientRect(MainWnd, rec); MyDC := GetDC(MainWnd); SaveDC(MyDC); xVisj := round((rec.Bottom - rec.Top)/2); yVisj := round((rec.Right - rec.Left)/2); maschtab := (rec.Right - rec.Left)/(xEndInterval - xStartInterval); part_interval_koor := (rec.Right - rec.Left)/ part_count; part_interval_koor_y := (rec.bottom - rec.top)/part_count; createEnhMetaFile(myDc, 'lab3_Meta', nil, nil); //beginPath(MyDC); MoveToEx(MyDC, rec.Left, xVisj, nil); LineTo(MyDC, rec.Right, xVisj); MoveToEx(MyDC, yVisj, rec.Top , nil); LineTo(MyDC, yVisj, rec.Bottom); for curent_part := 1 to part_count do begin MoveToEx(MyDC, round(rec.Left+((curent_part-1)*part_interval_koor)), xvisj - 5, nil); LineTo(MyDC, round(rec.Left+((curent_part-1)*part_interval_koor)), xvisj + 5); MoveToEx(MyDC, yvisj - 5, round(rec.Top + ((curent_part -1 )*part_interval_koor_y)), nil); LineTo(MyDC, yvisj + 5, round(rec.Top + ((curent_part -1 )*part_interval_koor_y))); Str(xStartInterval+(curent_part-1)*part_interval_num:6:1, help); TextOUT(MyDC, round(rec.Left+((curent_part-1)*part_interval_koor))-2, xvisj + 7, PChar(help) , 6); //Str(xStartInterval+(curent_part-1)*part_interval_num*12:6:1, help); //TextOUT(MyDC, yvisj -2, round(rec.top+((curent_part-1)*part_interval_koor))+ 7, PChar(help) , 6); end; draw_y; draw_y3; draw_y4; //EndPath(MyDC); //StrokePath(MyDC); //CloseEnhMetaFile(MyDC); RestoreDC(MyDC,1); ReleaseDC(MainWnd, MyDC); DeleteDC(MyDC); end; end. Результати роботи: 
Допоможи студентському архіву

Ми допомогли тобі — допоможи наступному студенту

Файл ще не обрано

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!