Untitled
7-8unknown
c_cpp
2 years ago
7.9 kB
8
Indexable
#define XMAX 800//Размер окна по горизонтали
#define YMAX 400//Размер окна по вертикали
#include <windows.h>
#include <windowsx.h>
/*Прототипы используемых в программе функций*/
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL OnCreate(HWND, LPCREATESTRUCT);//Прототип функции OnCreate
void OnPaint(HWND);//Прототип функции OnPaint
void OnDestroy(HWND);//Прототип функции OnDestroy
/*Глобальные переменные, доступные всем функциям*/
HFONT hFont1, hFont2, hFont3, hFont4;//Четыре фонта
HBRUSH hBrush;//Кисть
/*Главная функция WinMain */
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
char szClassName[] = "MainWindow";
char szTitle[] = "Программа 4";
MSG Msg;
WNDCLASS wc;
/* Регистрация класса главного окна */
ZeroMemory(&wc, sizeof(wc));
wc.lpfnWndProc = WndProc;
wc.hInstance = hInst;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = GetStockBrush(WHITE_BRUSH);
wc.lpszClassName = szClassName;
RegisterClass(&wc);
/* Создание главного окна и отображение его на экране */
HWND hwnd = CreateWindow(szClassName, szTitle,
WS_OVERLAPPEDWINDOW, 100, 80, XMAX, YMAX,
HWND_DESKTOP, NULL, hInst, NULL);
ShowWindow(hwnd, SW_SHOWNORMAL);
/* Организация цикла обнаружения сообщений */
while (GetMessage(&Msg, NULL, 0, 0))
DispatchMessage(&Msg);
return 0;
}
/* Оконная функция WndProc главного окна */
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
HANDLE_MSG(hwnd, WM_CREATE, OnCreate);
HANDLE_MSG(hwnd, WM_PAINT, OnPaint);//Обработка сообщения WM_PAINT
HANDLE_MSG(hwnd, WM_DESTROY, OnDestroy);//Обработка сообщения WM_DESTROY
default:
return(DefWindowProc(hwnd, msg, wParam, lParam));
}
}
/*Функция обработки сообщения WM_CREATE*/
BOOL OnCreate(HWND, LPCREATESTRUCT)
{
char lpszFace1[] = "Courier New Cyr";//Имя Windows для шрифта
char lpszFace2[] = "Times New Roman Cyr";//Имя Windows для шрифта
char lpszFace3[] = "Arial Cyr";//Имя Windows для шрифта
LOGFONT lf;//Структура LOGFONT для создания шрифтов
ZeroMemory(&lf, sizeof(lf));//Обнуление структуры (обязательно)
/*Создадим шрифт 1 (для заголовка)*/
lf.lfHeight = 26;//Размер
lf.lfUnderline = 1;//Подчеркивание
strcpy_s(lf.lfFaceName, lpszFace1);//Копируем имя шрифта
hFont1 = CreateFontIndirect(&lf);//Создание шрифта
/*Создадим шрифт 2 (для подзаголовка и цифр лет)*/
lf.lfHeight = 21;//Размер
lf.lfUnderline = 0;//Подчеркивание
lf.lfItalic = 0;//Курсив
strcpy_s(lf.lfFaceName, lpszFace2);//Копируем имя шрифта
hFont2 = CreateFontIndirect(&lf);//Создание шрифта
/*Создадим шрифт 3 (для оси y)*/
lf.lfHeight = 19;//Размер
lf.lfItalic = 0;//Отмена курсива
lf.lfEscapement = 900;//Угол наклона 90 градусов
strcpy_s(lf.lfFaceName, lpszFace3);//Копируем имя шрифта
hFont3 = CreateFontIndirect(&lf);//Создание шрифта
/*Создадим шрифт 4 (для шкалы)*/
lf.lfHeight = 18;//Размер
lf.lfEscapement = 0;//Отмена угла наклона
hFont4 = CreateFontIndirect(&lf);//Создание шрифта
/*Создадим Оранжевый кисть*/
hBrush = CreateSolidBrush(RGB(255, 165, 0));
return TRUE;
}
/*Функция обработки сообщения WM_DESTROY*/
void OnDestroy(HWND)
{
PostQuitMessage(0);
}
/*Функция обработки события WM_PAINT*/
void OnPaint(HWND hwnd)
{
RECT r; //Прямоугольник для надписей
PAINTSTRUCT ps;//Структура, требуемая для рисования в рабочей области
TEXTMETRIC tm; //Для получения характеристик шрифтов
char szMainTitle[] = "Факультет математики и информационных технологий (ФМиИТ)";//Заголовок
char szSubTitle[] = "Выпуск студентов по годам";//Подзаголовок
char szYAxes[] = "Выпускники ВУЗ'a";//Надпись по оси y
const char* szYears[10] = { "2013","2014","2015","2016","2017", "2018","2019","2020","2021","2022" };//диаграммой
const char* szScale[3] = { "1000","500","0" };//Шкала
int nData[10] = { 80,15,22,45,60,65,70,65,59,40 };//Данные для диаграммы
HDC hdc = BeginPaint(hwnd, &ps);//Получение контекста устройства
/*Нарисуем большой прямоугольник*/
Rectangle(hdc, 90, 120, 550, 320);
/*Выведем строку заголовка*/
HFONT hOldFont = SelectFont(hdc, hFont1);//Выберем в контекст шрифт 1
SetTextColor(hdc, RGB(0, 0, 0));//Установим черный цвет
GetTextMetrics(hdc, &tm);//Получим метрики текста
r.left = 0;//Задание координат прямоугольника, в который
r.top = 10;//будет выводиться текст заголовка
r.right = XMAX;
r.bottom = r.top + tm.tmHeight;//Высоту прямоугольника выберем по высоте шрифта
DrawText(hdc, "Факультет математики и информационных технологий (ФМиИТ)", strlen(szMainTitle), &r, DT_CENTER);//Выведен текст
/*Выведем строку подзаголовка*/
SetTextColor(hdc, RGB(255, 160, 0));//Установим Оранжевый цвет
SelectFont(hdc, hFont2);//Выберем шрифт 2
GetTextMetrics(hdc, &tm);//Получим метрики текста
r.left = 0;//Задание координат прямоугольника для
r.top = r.bottom + 5;//строки с подзаголовком
r.right = XMAX;
r.bottom += tm.tmHeight + 5;//Высоту прямоугольника выберем по высоте шрифта
DrawText(hdc, "Выпуск студентов по годам", strlen(szSubTitle), &r, DT_CENTER);//Выведен текст
/*Выведем строку лет*/
for (int i = 0; i < 10; i++)
TextOut(hdc, 100 + i * 45, 330, szYears[i], strlen(szYears[i]));
/*Выведем вертикальную строку по оси y*/
SelectFont(hdc, hFont3);//Выберем шрифт 3 (вертикальный)
SetTextColor(hdc, RGB(255, 160, 0));//Установим Умбра “жжёная” цвет
TextOut(hdc, 30, 320, szYAxes, strlen(szYAxes));//Выведем надпись
SelectFont(hdc, hFont4);//Выберем шрифт 4
for (int j = 2; j >= 0; j--)//Выведем значения масштаба
TextOut(hdc, 60, 110 + j * 100, szScale[j], strlen(szScale[j]));
SelectFont(hdc, hOldFont);
/*Нарисуем столбцовую диаграмму*/
SelectBrush(hdc, hBrush);//Выберем кисть в контекст
for (int k = 0; k < 10; k++)//Выведем столбцы диаграммы
Rectangle(hdc, 100 + k * 45, 320 - nData[k] * 2, 100 + k * 45 + 30, 320);
EndPaint(hwnd, &ps);//Освобождение контекста устройства
}
Editor is loading...