Untitled

7-8
 avatar
unknown
c_cpp
2 years ago
7.9 kB
7
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...