Отчёт
.docxМинистерство науки и высшего образования
Российской Федерации
Федеральное государственное бюджетное образовательное
учреждение высшего образования
«Ярославский государственный технический университет»
Кафедра «Информационные системы и технологии»
Отчет защищен
С оценкой _______
Преподаватель
к. т. н., доцент
А.П. Харитонов
«___» __________ 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; }