Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая / Курсовая (2).docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
683.09 Кб
Скачать

Системные требования

Таблица 4. Пользовательские функций

Минимальная версия клиента

Windows XP, Windows 2000 Professional [только классические приложения]

Минимальная версия сервера

Windows 2000 Server [только классические приложения]

DLL

MSVCP140D.dll

Свободное место

Не менее 1 мб свободного пространства на жестком диске

Список литературы

  1. Ю.А.Щупак - Win32 API. Разработка приложений для Windows. -

СПб.: Питер, 2008.

  1. Черкасова Н.И. Тексты лекций по дисциплине «Операционные системы» для студентов специальности 220100 дневного обучения, часть 2,.- М., РИО МГТУ ГА, 2017.

  2. Создание классических приложений для Windows с помощью API Win32 https://learn.microsoft.com/ru-ru/windows/win32/

  3. Конвертация типов данных https://www.convertdatatypes.com/

  4. Форум программистов и сисадминов Киберфорум https://www.cyberforum.ru/

  5. Stack Overflow — система вопросов и ответов о программировании https://stackoverflow.com/

Приложение 1. Руководство пользователя

Руководство пользователя

  1. Запуск программы осуществляется через exe-файл, находящийся в папке с проектом

Рисунок 1. Папка с исполняемым файлом

  1. Затем в поле для имен объектов необходимо ввести названия категорий из вашей выборки (Например: коты, собаки), а в поле для количества объектов ввести количество объектов в группах из выборки

Рисунок 2. Пример заполненных полей в программе

  1. После ввода и перепроверки введенных данных нажать кнопку ок, находящуюся внизу экрана. При ее нажатии на экране появится диалоговое окно, в котором будут показаны категории с процентами, которые они занимают в выборке, а также круговая диаграмма, построенная на основе вышеупомянутых данных

Рисунок 3. Пример выведенных данных

  1. Если у пользователя нет инструкции под рукой, он может нажать кнопку about в верхнем меню программы, чтобы получить все необходимые указания

Рисунок 4. Сообщение с инструкцией и авторством

  1. Если пользователь хочет завершить работу с программой, он должен нажать кнопку крестика в правом верхнем углу экрана, после чего программа выведет окно с вопросом, необходимое для подтверждения данной операции

Рисунок 5. Окно, подтверждающее выход из программы

Приложение 2. Листинг программы

WindowsProject1.cpp

#include <windows.h>

#include <gdiplus.h>

#include <sstream>

#include "resource.h"

#pragma comment (lib,"Gdiplus.lib")

using namespace Gdiplus;

WCHAR buf[50];

WCHAR buf2[50];

WCHAR buf3[50];

WCHAR buf4[50];

WCHAR buf5[50];

WCHAR buf6[50];

WCHAR buf7[50];

WCHAR buf8[50];

int counts[4] = {-1, -1, -1, -1};

double percent(int curr) {

int sum = counts[0] + counts[1] + counts[2] + counts[3];

double rct = ((100.0 * curr) / sum);

return rct;

}

int mathematic(int curr) {

int sum = counts[0] + counts[1] + counts[2] + counts[3];

int rct = ((360 * curr) / sum);

return rct;

}

BOOL check(WCHAR* a){

int r = 0;

for (int i = 0; i < wcslen(a); i++) {

char c = a[i];

if (((c >= 'A') && (c >= 'Z'))) {

r = 1;

break;

}

}

if (r == 1) return FALSE;

else return TRUE;

}

VOID OnPaint(HDC hdc)

{

Graphics graphics(hdc);

Pen pen(Color(100, 0, 0, 0));

RectF ellipseRect(100, 100, 100, 100);

REAL start = 0.0f;

for (int i = 0; i < 4; i++) {

SolidBrush solidBrush(Color(100, std::rand() % 255, std::rand() % 255, std::rand() % 255));

graphics.DrawPie(&pen, ellipseRect, start, mathematic(counts[i]));

graphics.FillPie(&solidBrush, ellipseRect, start, mathematic(counts[i]));

start = mathematic(counts[i]) + start;

}

}

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

INT_PTR CALLBACK AboutDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int

nCmdShow)

{

HWND hMainWnd;

HWND hwndButton;

HWND hwndEdit;

HWND hwndEditBig;

HWND Text1;

HWND Text2;

HWND Text3;

MSG msg;

GdiplusStartupInput gdiplusStartupInput;

ULONG_PTR gdiplusToken;

GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

WNDCLASSEX wc;

wc.cbSize = sizeof(wc);

wc.style = CS_HREDRAW | CS_VREDRAW;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);

wc.hCursor = LoadCursor(NULL, IDC_HELP);

wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

wc.lpszMenuName = NULL;

wc.lpszClassName = L"MyClass";

wc.hIconSm = LoadIcon(NULL, IDI_ERROR);

if (!RegisterClassEx(&wc)) {

MessageBox(NULL, L"Cannot register class", L"Error", MB_OK);

return 0;

}

hMainWnd = CreateWindow(L"MyClass", L"Draw pie", (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_OVERLAPPEDWINDOW) & ~(WS_THICKFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX), 0, 0, 640, 480, (HWND)NULL, (HMENU)NULL, (HINSTANCE)hInstance, NULL);

if (!hMainWnd) {

MessageBox(NULL, L"Cannot create main window", L"Error", MB_OK);

return 0;

}

hwndButton = CreateWindow(L"BUTTON", L"OK", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 252, 300, 100, 100, hMainWnd, (HMENU)1, (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE), NULL);

Text1 = CreateWindow(L"STATIC", L"Поле ввода имен данных", WS_CHILD | WS_VISIBLE, 150, 20, 200, 40, hMainWnd, (HMENU)11, (HINSTANCE)hInstance, NULL);

Text2 = CreateWindow(L"STATIC", L"Поле ввода количества данных", WS_CHILD | WS_VISIBLE, 330, 20, 250, 40, hMainWnd, (HMENU)12, (HINSTANCE)hInstance, NULL);

Text3 = CreateWindow(L"STATIC", L"<- Нажми сюда, чтобы получить результат", WS_CHILD | WS_VISIBLE, 360, 350, 200, 40, hMainWnd, (HMENU)13, (HINSTANCE)hInstance, NULL);

int ID1 = 2;

int ID2 = 6;

int y = 50;

for (int i = 0; i < 4; i++) {

hwndEditBig = CreateWindow(L"EDIT", NULL, WS_BORDER | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 200, y, 100, 30, hMainWnd, (HMENU)ID1, (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE), NULL);

hwndEdit = CreateWindow(L"EDIT", NULL, WS_BORDER | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 350, y, 40, 30, hMainWnd, (HMENU)ID2, (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE), NULL);

ID1++;

ID2++;

y += 50;

}

ShowWindow(hMainWnd, nCmdShow);

while (GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

GdiplusShutdown(gdiplusToken);

return msg.wParam;

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

HINSTANCE h;

h = GetModuleHandle(NULL);

HICON hIcon;

HICON sm;

switch (uMsg)

{

case WM_CREATE:

HMENU hMenu;

hMenu = CreateMenu();

AppendMenuW(hMenu, MF_STRING, IDM_ABOUT, L"About");

SetMenu(hWnd, hMenu);

hIcon = LoadIcon(h, MAKEINTRESOURCE(IDI_ICON1));

sm = (HICON)LoadImage(h, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);

SetClassLongPtr(hWnd, GCLP_HICON, (LONG_PTR)hIcon);

SetClassLongPtr(hWnd, GCLP_HICONSM, (LONG_PTR)sm);

break;

case WM_CLOSE:

if(MessageBox(hWnd, L"Вы точно хотите выйти?", L"Вопрос", MB_OKCANCEL) == IDOK) DestroyWindow(hWnd);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

case WM_CTLCOLORSTATIC:

{

HDC hdcStatic = (HDC)wParam;

SetBkColor(hdcStatic, RGB(250, 255, 255));

return (INT_PTR)CreateSolidBrush(RGB(250, 255, 255));

}

case WM_COMMAND:

switch (LOWORD(wParam)) {

case IDM_ABOUT:

MessageBox(hWnd, L"Draw pie. Разработано Бродниковым Сергеем, ИС 2-1. 2024. Инструкция. В поле для имен объектов необходимо ввести названия категорий из вашей выборки (Например: коты, собаки), а в поле для количества объектов ввести количество объектов в категориях из выборки. После ввода и перепроверки введенных данных нажать кнопку ок, находящуюся внизу экрана. Чтобы выйти из программы, нажмите кнопку крестика в правом верхнем углу экрана.", L"About", MB_OK);

}

if (wParam == 1) {

GetDlgItemText(hWnd, 2, buf, 50);

GetDlgItemText(hWnd, 3, buf2, 50);

GetDlgItemText(hWnd, 4, buf3, 50);

GetDlgItemText(hWnd, 5, buf4, 50);

GetDlgItemText(hWnd, 6, buf5, 50);

GetDlgItemText(hWnd, 7, buf6, 50);

GetDlgItemText(hWnd, 8, buf7, 50);

GetDlgItemText(hWnd, 9, buf8, 50);

if (check(buf5) == FALSE || check(buf6) == FALSE || check(buf7) == FALSE || check(buf8) == FALSE) {

MessageBox(NULL, L"Не пишите буквы в поле для чисел", L"Ошибка", MB_OK);

}

else {

counts[0] = _wtoi(buf5);

counts[1] = _wtoi(buf6);

counts[2] = _wtoi(buf7);

counts[3] = _wtoi(buf8);

DialogBox(h, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, AboutDlgProc);

}

}

default:

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

}

return 0;

}

INT_PTR CALLBACK AboutDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,

LPARAM lParam)

{

HDC hd;

PAINTSTRUCT p;

RECT rct;

switch (uMsg) {

case WM_COMMAND:

switch (LOWORD(wParam)) {

case IDOK:

case IDCANCEL:

EndDialog(hDlg, 0);

}

break;

case WM_PAINT:

std::wstringstream ss;

ss << percent(counts[0]);

wcscat(buf, L" ");

wcscat(buf, ss.str().c_str());

wcscat(buf, L"%");

ss << percent(counts[0]);

SetDlgItemText(hDlg, IDC_STATIC1, buf);

std::wstringstream ss2;

ss2 << percent(counts[1]);

wcscat(buf2, L" ");

wcscat(buf2, ss2.str().c_str());

wcscat(buf2, L"%");

SetDlgItemText(hDlg, IDC_STATIC2, buf2);

std::wstringstream ss3;

ss3 << percent(counts[2]);

wcscat(buf3, L" ");

wcscat(buf3, ss3.str().c_str());

wcscat(buf3, L"%");

SetDlgItemText(hDlg, IDC_STATIC3, buf3);

std::wstringstream ss4;

ss4 << percent(counts[3]);

wcscat(buf4, L" ");

wcscat(buf4, ss4.str().c_str());

wcscat(buf4, L"%");

SetDlgItemText(hDlg, IDC_STATIC4, buf4);

hd = BeginPaint(hDlg, &p);

GetClientRect(hDlg, &rct);

OnPaint(hd);

}

return FALSE;

}

Приложение 3. Структура и схемы программы

Соседние файлы в папке курсовая