Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Отчёт

.docx
Скачиваний:
39
Добавлен:
12.01.2020
Размер:
918.26 Кб
Скачать

Министерство науки и высшего образования

Российской Федерации

Федеральное государственное бюджетное образовательное

учреждение высшего образования

«Ярославский государственный технический университет»

Кафедра «Информационные системы и технологии»

Отчет защищен

С оценкой _______

Преподаватель

к. т. н., доцент

А.П. Харитонов

«___» __________ 2019

API OC WIN 32

Отчет по лабораторной работе

по курсу “Операционные системы”

ЯГТУ 09.03.02 – 007 ЛР

Работу выполнил

студент гр. ЭИС-14

Ивин П.А.

«___» __________ 2019

2019

Содержание

Структура программы…………………………………………………………2

  • Способ организации данных

  • Основные функции программы

Описание работы пользователя ………………………………………………4

Блок схемы алгоритмов ……………………………………………………….7

  • WinMain

  • WndProc

  • WM_PAINT

  • WM_KEYDOWN

Листинг программы…………………………………………………………….10

Цель работы:

  • Изучение интерфейса прикладного программирования операционных систем семейства Win32.

  • Разработка простейших программ с использованием API Windows.

  • Разработка прикладной программы с графическим интерфейсом, которая реализует функции:

    • Создание фигур

    • Перемещение

    • Изменение размера

    • Удаление

    • Переключение активной фигуры

Фигуры, задействованные в программе:

Структура программы:

nMax = 10 - константа n - количество фигур m=-1 - номер фигуры в массиве Задействованы статические массивы, размером nMax: int X[nMax], Y[nMax] - координаты по x и y R[nMax] - радиус int V[nMax] - видимость на экране T[nMax] - тип фигуры W[nMax] - тип линии double A[nMax] - угол поворота

Работа пользователя:

В открытом файле нажать «Скомпилировать и выполнить» (F11).

Далее появится пустое окно, для вызова необходимых фигур см. табл. 1.

Фигура

Клавиша

Рисунок

Правильный треугольник

F1

Пятиугольник

F7

Труегольник

F8

При нажатии F1 появляется правильный треугольник, также при нажатии других клавиш (см. табл.), фигуры будут появляться в том же месте. Фигура при создании автоматически становится активной и, соответственно, выделено красным

В данный момент, активная фигура – пятиугольник. Помимо всего, мы можем перемещать фигуру с помощью нажатия ЛКМ: перетащите курсор на нужную точку в окне и нажмите левую кнопку мыши.

В программе существует ограничение на количество созданных фигур, если вы попытаетесь сделать 11 фигур, программа выдаст следующую ошибку:

Если нажать на клавишу Delete, мы удалим активную фигуру и переключимся на созданную ранее.

Переключаться между фигурами можно на клавиши Right и Left (стрелочки вправо и влево)

И последняя возможность этой программы – это увеличение и уменьшеие размера фигуры. Для увеличение необходимо на нажать на клавишу Up (стрелочка вверх), для уменьшения – Down (стрелочка вниз)

Клавиша

Функция

Увеличение фигуры на 5 ед.

Уменьшение фигуры на 5 ед.

Переключение активной фигуры влево

Переключение активной фигуры вправо

Блок-схемы:

Листинг программы:

#include <windows.h> #include <math.h> const int nMax = 10; const float pi=3.14; int n=0 /*количество фигур*/, m=-1 /*номер фигуры в массиве*/, K=1; int X[nMax], Y[nMax], /*координаты по x и y*/ R[nMax] /*радиус*/; int V[nMax]/*видимость на экране*/, T[nMax] /*тип фигуры*/ , W[nMax] /*тип линии*/ ; double A[nMax] /*угол поворота*/; LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {

HDC hDC; HPEN Pen1,Pen2; // создание кистей PAINTSTRUCT ps;

RECT rect;

switch (uMsg)

{

case WM_PAINT: //создание фигур

hDC=BeginPaint (hwnd, &ps);

HPEN p1, p2;

p1=CreatePen (PS_SOLID, 1, RGB (0,0,0)); // обычная кисть

p2=CreatePen (PS_SOLID, 3, RGB (255, 0, 0)); // кисть для активной фигуры

for (int i=0;i<n;i++)

{

if (V[i]==1)

{

if (W[i]==1) SelectObject(hDC, p1);

else if (W[i]==2) SelectObject(hDC, p2);

if (T[i]==1) // создание первой фигуры (правильного треугольника)

{

MoveToEx (hDC, X[i], Y[i]-R[i], NULL);

LineTo (hDC, X[i]+R[i]*cos(A[i]), Y[i]+R[i]*sin(A[i]));

LineTo (hDC, X[i]-R[i]*cos(A[i]), Y[i]+R[i]*sin(A[i]));

LineTo (hDC, X[i], Y[i]-R[i]);

}

else if (T[i]==7) // создание седьмой фигуры (пятиугольника)

{

MoveToEx (hDC, X[i]-R[i], Y[i], NULL);

LineTo (hDC, X[i], Y[i]+R[i]);

LineTo (hDC, X[i]+R[i], Y[i]);

LineTo (hDC, X[i]+R[i]*cos(A[i]), Y[i]-R[i]*sin(A[i]));

LineTo (hDC, X[i]-R[i]*cos(A[i]), Y[i]-R[i]*sin(A[i]));

LineTo (hDC, X[i]-R[i], Y[i]);

}

else if (T[i]==8) // создание восьмой фигуры (треугольника)

{

MoveToEx (hDC, X[i], Y[i]-R[i], NULL);

LineTo (hDC, X[i]-R[i]*cos(A[i]), Y[i]+R[i]*sin(A[i]));

LineTo (hDC, X[i]+R[i]*cos(A[i]), Y[i]+R[i]*sin(A[i]));

LineTo (hDC, X[i], Y[i]-R[i]);

}

}

}

EndPaint(hwnd,&ps);

break;

case WM_LBUTTONDOWN://обработка нажатия ЛКМ

if (m>-1)

{

X[m] = LOWORD(lParam); // обработка координат нажатия по x и y

Y[m] = HIWORD(lParam);

}

GetClientRect (hwnd, &rect); // обновление окна

InvalidateRect (hwnd, &rect,-1);

UpdateWindow(hwnd);

break;

case WM_RBUTTONDOWN:

GetClientRect (hwnd, &rect);

InvalidateRect (hwnd ,&rect,-1);

UpdateWindow(hwnd);

break;

case WM_KEYDOWN://обработка нажатия клавиш клавиатуры

if (n<nMax)

{

if (wParam==VK_F1)

{

W[m]=1;

n++;

m=n-1;

X[m]=100;

Y[m]=100;

R[m]=50;

V[m]=1;

W[m]=2;

A[m]=pi/6;

T[m]=1;

}

If (wParam==VK_F7)

{

W[m]=1;

n++;

m=n-1;

X[m]=100;

Y[m]=100;

R[m]=50;

V[m]=1;

W[m]=2;

A[m]=pi/3;

T[m]=7;

}

if (wParam==VK_F8)

{

W[m]=1;

n++;

m=n-1;

X[m]=100;

Y[m]=100;

R[m]=50;

V[m]=1;

W[m]=2;

A[m]=pi/3;

T[m]=8;

}

}

else

{

MessageBox (NULL, "Вызвано максимальное количество фигур", "Error", MB_OK); // обработка ошибки, в случае вызова больше 10 фигур

return 0;

}

if (n>0)

{

if (wParam==VK_UP) R[m]+=5; // увеличение фигуры

((wParam==VK_DOWN) && (R[m]>5)) R[m]-=5; // уменьшение фигуры

if (wParam==VK_LEFT) // смена активной фигуры влево

{

W[m]=1;

if (m<1) m=n;

m--;

W[m]=2;

}

if (wParam==VK_RIGHT) // смена активной фигуры вправо

{

W[m]=1;

if (m>n-2) m=-1;

m++;

W[m]=2;

}

if (wParam==VK_DELETE) // удаление фигуры

{

for (int i=m; i<n-1; ++i)

{

X[i]=X[i+1]; Y[i]=Y[i+1]; R[i]=R[i+1]; V[i]=V[i+1]; W[i]=W[i+1]; A[i]=A[i+1]; T[i]=T[i+1];

} n--; m--; W[m]=2; } }

GetClientRect(hwnd,&rect);

InvalidateRect(hwnd,&rect,-1);

UpdateWindow(hwnd);

break;

case WM_DESTROY: //закрытие окна

PostQuitMessage (0);

break;

default:

return DefWindowProc(hwnd,uMsg,wParam,lParam);

}

return 0;

}

/* The 'main' function of Win32 GUI programs: this is where execution starts */

int WINAPI /* порядок передачи параметров при вызове процедуры*/ WinMain (HINSTANCE hInstance, HINSTANCE /*условный номер программы*/ hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

WNDCLASSEX wc; /* A properties struct of our window */

HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */

MSG msg; /* A temporary location for all messages */

/* zero out the struct and set the stuff we want to modify */

memset(&wc,0,sizeof(wc));

wc.cbSize = sizeof(WNDCLASSEX);

wc.lpfnWndProc = WndProc; /* This is where we will send messages to */

wc.hInstance = hInstance;

wc.hCursor = LoadCursor(NULL, IDC_ARROW);

/* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */

wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

wc.lpszClassName = "WindowClass";

wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */

wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */

if(!RegisterClassEx(&wc)) {

MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);

return 0;

}

hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW, /*создание окна*/

CW_USEDEFAULT, /* x */

CW_USEDEFAULT, /* y */

640, /* ширина*/

480, /* высота */

NULL,NULL,hInstance,NULL);

if(hwnd == NULL) {

MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);

return 0;

}

while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */

TranslateMessage(&msg); /* Translate key codes to chars if present */

DispatchMessage(&msg); /* Send it to WndProc */

} return msg.wParam; }