- •Аннотация
- •Оглавление
- •Техническое задание на выполнение курсовой работы
- •Теоретические сведения Краткие сведения об операционной системе Windows
- •Краткие сведения о Win32 api, и принцип создания Win32 программы
- •Описание среды разработки
- •Создание Win32 приложения Состав и характеристики файлов проекта
- •Системные требования
- •Список литературы
- •Руководство пользователя
- •Структура программы
- •Схемы функций
Системные требования
Таблица 4. Пользовательские функций
-
Минимальная версия клиента
Windows XP, Windows 2000 Professional [только классические приложения]
Минимальная версия сервера
Windows 2000 Server [только классические приложения]
DLL
MSVCP140D.dll
Свободное место
Не менее 1 мб свободного пространства на жестком диске
Список литературы
Ю.А.Щупак - Win32 API. Разработка приложений для Windows. -
СПб.: Питер, 2008.
Черкасова Н.И. Тексты лекций по дисциплине «Операционные системы» для студентов специальности 220100 дневного обучения, часть 2,.- М., РИО МГТУ ГА, 2017.
Создание классических приложений для Windows с помощью API Win32 https://learn.microsoft.com/ru-ru/windows/win32/
Конвертация типов данных https://www.convertdatatypes.com/
Форум программистов и сисадминов Киберфорум https://www.cyberforum.ru/
Stack Overflow — система вопросов и ответов о программировании https://stackoverflow.com/
Приложение 1. Руководство пользователя
Руководство пользователя
Запуск программы осуществляется через exe-файл, находящийся в папке с проектом
Рисунок 1. Папка с исполняемым файлом
Затем в поле для имен объектов необходимо ввести названия категорий из вашей выборки (Например: коты, собаки), а в поле для количества объектов ввести количество объектов в группах из выборки
Рисунок 2. Пример заполненных полей в программе
После ввода и перепроверки введенных данных нажать кнопку ок, находящуюся внизу экрана. При ее нажатии на экране появится диалоговое окно, в котором будут показаны категории с процентами, которые они занимают в выборке, а также круговая диаграмма, построенная на основе вышеупомянутых данных
Рисунок 3. Пример выведенных данных
Если у пользователя нет инструкции под рукой, он может нажать кнопку about в верхнем меню программы, чтобы получить все необходимые указания
Рисунок 4. Сообщение с инструкцией и авторством
Если пользователь хочет завершить работу с программой, он должен нажать кнопку крестика в правом верхнем углу экрана, после чего программа выведет окно с вопросом, необходимое для подтверждения данной операции
Рисунок 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. Структура и схемы программы
