- •Ф едеральное агенство воздушного транспорта (росавиация)
- •Аннотация
- •1.Введение
- •2.Техническое задание
- •3.Теоретические сведения
- •3.1. Особенности создания приложений для ос семейства Windows
- •3.2. Краткая характеристика функций api
- •3.3.Описание среды выполнения
- •3. Состав и характеристики файлов проекта
- •4. Стандартные классы, структуры и функции приложения
- •5. Пользовательские классы и функции приложения
- •6. Структура программы
- •7.Системные требования.
- •8.Список литературы
- •10.Приложение
- •10.1Листинги программ
- •10.2Алгоритмы функций.
10.Приложение
10.1Листинги программ
Shulte20.cpp
#include <windows.h>
#include <string>
#include <ctime>
#include <windowsx.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
const int n = 5; // Размер таблицы
int shulteTable[n][n]; // Таблица
int currentNumber = 1; // Номер, который нужно найти
int squareSize = 60; // Размер клетки
int offsetX = 60, offsetY = 60; // Смещение для первой клетки
clock_t startTime, buffTime; // Время начала, время для отображение на экране
int errors = 0;// Кол-во ошибок, допкщенных пользователем
std::wstring timePassed;// строка для отображения времени
bool f = false;
HINSTANCE g_instance = 0;
#define START_BTN_ID 101
#define INFO_BTN_ID 102
void GenerateShulteTable() {
int nums[n * n];
for (int i = 0; i < n * n; i++) nums[i] = i + 1;
srand(time(NULL));
for (int i = n * n - 1; i > 0; i--) {
int j = rand() % (i + 1);
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
int k = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
shulteTable[i][j] = nums[k];
k++;
}
}
}
void DrawShulteTable(HDC hdc) {
HFONT hFont = CreateFont(24, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, VARIABLE_PITCH, L"Arial");
SelectObject(hdc, hFont);
RECT rect;
rect.top = offsetY;
rect.bottom = offsetY + squareSize;
for (int i = 0; i < n; i++) {
rect.left = offsetX;
rect.right = offsetX + squareSize;
for (int j = 0; j < n; j++) {
std::wstring num = std::to_wstring(shulteTable[i][j]);
DrawText(hdc, num.c_str(), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
rect.left += squareSize;
rect.right += squareSize;
}
rect.top += squareSize;
rect.bottom += squareSize;
}
DeleteObject(hFont);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
WNDCLASS wc = { 0 };
wc.lpszClassName = L"ShulteTable";
wc.hInstance = hInstance;
g_instance = hInstance;
wc.lpfnWndProc = WndProc;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
RegisterClass(&wc);
HWND hwnd = CreateWindow(wc.lpszClassName, L"Shulte Table Test", (WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_OVERLAPPED) &~(WS_THICKFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX), 100, 100, n * squareSize + 130, n * squareSize + 150, NULL, NULL, hInstance, NULL);
MSG msg;
GenerateShulteTable(); // Генерация таблицы Шульте
UpdateWindow(hwnd);
ShowWindow(hwnd, nCmdShow);
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_CREATE:{
HMENU hMenu, hSubMenu;
hMenu = CreateMenu();
hSubMenu = CreatePopupMenu();
CreateWindow(L"button", L"Start", WS_CHILD | WS_VISIBLE, n * squareSize, 5, 90, 15, hWnd, (HMENU)START_BTN_ID, g_instance, 0);
CreateWindow(L"button", L"Info", WS_CHILD | WS_VISIBLE, n * squareSize, 25, 90, 15, hWnd, (HMENU)INFO_BTN_ID, g_instance, 0);
AppendMenu(hSubMenu, MF_STRING, 1, L"Об авторе");
AppendMenu(hSubMenu, MF_STRING, 2, L"О программе");
AppendMenu(hSubMenu, MF_STRING, 3, L"Выход");
AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hSubMenu, L"Меню");
SetMenu(hWnd, hMenu);
}
case WM_COMMAND: {
switch (LOWORD(wParam)){
case INFO_BTN_ID:
MessageBox(hWnd, L"Вам представлены числа в таблице от 1 до 25.\nВ левом углу есть счётчик, указывающий на текущее число для нажатия, и таймер.\nВаша задача поочереди нажимать на ячейки в порядке \nвозрастания.\nПосле нажатия кнопки Start вы сможете \nвзаимодействовать с таблицей.\nТакже запуститься таймер.\nВаши ошибки съедают время)\nВ конце вы узнаете свои результаты(количесвто ошибок и время прохождения).", L"Инструкция", MB_OK | MB_ICONINFORMATION);
break;
case START_BTN_ID:
f = true;
startTime = clock(); // Запуск секундомера
break;
case 1:
MessageBox(hWnd, L"Автор: Ермолин Владислав Константинович\nГруппа: ИС2-2", L"Об авторе", MB_OK | MB_ICONINFORMATION);
break;
case 2:
MessageBox(hWnd, L"Данное приложение сделано в рамках курсовой работы\nпо диспицплине Операционные системы.\nТематика курсовой: создания приложения для проверки\nвнимательности (основана на таблице Шульте).", L"О приложении", MB_OK | MB_ICONINFORMATION);
break;
case 3:
PostQuitMessage(0);
break;
}
}
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
for (int i = 0; i <= n; i++) {
// Горизонтальные линии
int y = offsetY + i * squareSize;
MoveToEx(hdc, offsetX, y, NULL);
LineTo(hdc, offsetX + n * squareSize, y);
// Вертикальные линии
int x = offsetX + i * squareSize;
MoveToEx(hdc, x, offsetY, NULL);
LineTo(hdc, x, offsetY + n * squareSize);
}
if (f == true) buffTime = clock() - startTime;
else buffTime = time_t(0);
std::wstring numberToFind = L"Найти: " + std::to_wstring(currentNumber);
timePassed = L"Прошло времени: " + std::to_wstring((buffTime) / CLOCKS_PER_SEC) + L" секунд";
TextOut(hdc, 10, 10, numberToFind.c_str(), numberToFind.length());
TextOut(hdc, 10, 30, timePassed.c_str(), timePassed.length());
DrawShulteTable(hdc);
EndPaint(hWnd, &ps);
break;
}
case WM_LBUTTONDOWN: {
int x = GET_X_LPARAM(lParam);
int y = GET_Y_LPARAM(lParam);
int j = (x - offsetX) / squareSize;
int i = (y - offsetY) / squareSize;
if (i >= 0 && i < n && j >= 0 && j < n) {
if (shulteTable[i][j] == currentNumber and f == true) {
currentNumber++;
if (currentNumber == n * n + 1) {
MessageBox(hWnd, (L"Поздравляем! Вы прошли тест!\nКоличесвто ошибок: " + std::to_wstring(errors) + L"\n" + timePassed).c_str(), L"Результаты", MB_OK | MB_ICONINFORMATION);
PostQuitMessage(0);
}
InvalidateRect(hWnd, NULL, TRUE);
}
else {
if (f == true and x > squareSize and y > squareSize)
{
MessageBox(hWnd, L"Неправильное число!", L"Ошибка", MB_OK | MB_ICONERROR);
errors++;
}
}
if (f == false) { }
}
InvalidateRect(hWnd, NULL, TRUE);
break;
}
case WM_DESTROY:{
PostQuitMessage(0);
break;
}
default: return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}
Shulte20.rc
//Сценарий ресурсов, созданный в Microsoft Visual C++.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Создано из ресурса TEXTINCLUDE.
//
#ifndef APSTUDIO_INVOKED
#include "targetver.h"
#endif
#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
LANGUAGE 25, 1
/////////////////////////////////////////////////////////////////////////////
//
// Значок
//
// Значок с наименьшим значением идентификатора помещается первым, чтобы гарантировать использование
// идентичного значка приложения для всех систем.
IDI_SHULTE20 ICON "Shulte20.ico"
IDI_SMALL ICON "small.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Меню
//
IDC_SHULTE20 MENU
BEGIN
POPUP "&Файл"
BEGIN
MENUITEM "Вы&ход", IDM_EXIT
END
POPUP "&Справка"
BEGIN
MENUITEM "&О программе...", IDM_ABOUT
END
END
/////////////////////////////////////////////////////////////////////////////
//
// Ускоритель
//
IDC_SHULTE20 ACCELERATORS
BEGIN
"?", IDM_ABOUT, ASCII, ALT
"/", IDM_ABOUT, ASCII, ALT
END
/////////////////////////////////////////////////////////////////////////////
//
// Диалоговое окно
//
IDD_ABOUTBOX DIALOGEX 0, 0, 170, 62
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "О программе Shulte20"
FONT 8, "MS Shell Dlg"
BEGIN
ICON IDI_SHULTE20,IDC_STATIC,14,14,21,20
LTEXT "Shulte20, Версия 1.0",IDC_STATIC,42,14,114,8,SS_NOPREFIX
LTEXT "(c) 2024",IDC_STATIC,42,26,114,8
DEFPUSHBUTTON "ОК",IDOK,113,41,50,14,WS_GROUP
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_ABOUTBOX, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 163
TOPMARGIN, 7
BOTTOMMARGIN, 55
END
END
#endif // APSTUDIO_INVOKED
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#ifndef APSTUDIO_INVOKED\r\n"
"#include ""targetver.h""\r\n"
"#endif\r\n"
"#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
"#include ""windows.h""\r\n"
"#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Таблица строк
//
STRINGTABLE
BEGIN
IDC_SHULTE20 "SHULTE20"
IDS_APP_TITLE "Shulte20"
END
#endif
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Создано из ресурса TEXTINCLUDE.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
