Untitled
unknown
c_cpp
2 years ago
16 kB
12
Indexable
// Laba2_n.cpp : Определяет точку входа для приложения.
//
#include <windows.h>;
#include "framework.h"
#include "Laba2_n.h"
#define MAX_LOADSTRING 100
// Глобальные переменные:
HINSTANCE hInst; // текущий экземпляр
WCHAR szTitle[MAX_LOADSTRING]; // Текст строки заголовка
WCHAR szWindowClass[MAX_LOADSTRING]; // имя класса главного окна
// Отправить объявления функций, включенных в этот модуль кода:
// Объявление функции для регистрации класса окна.
ATOM MyRegisterClass(HINSTANCE hInstance);
// Объявление функции для инициализации экземпляра приложения.
BOOL InitInstance(HINSTANCE, int);
// Объявление функции-обработчика сообщений окна (вызывается Windows при возникновении событий в окне).
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
// Объявление функции-обработчика диалогового окна "About".
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
// Основная функция приложения (аналог main в консольных приложениях).
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
// Игнорируем неиспользуемые параметры, чтобы избежать предупреждений компилятора.
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: Разместите код здесь.
// Инициализация глобальных строк
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadStringW(hInstance, IDC_LABA2N, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Выполнить инициализацию приложения:
if (!InitInstance(hInstance, nCmdShow))
{
return FALSE;
}
// Загрузка таблицы ускорителей (горячих клавиш)
HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_LABA2N));
MSG msg;
// Основной цикл обработки сообщений:
while (GetMessage(&msg, nullptr, 0, 0))
{
// Проверка, является ли сообщение командой от ускорителя
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
// Если сообщение не обрабатывается ускорителем, выполняем его обычную обработку
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
// Возврат кода завершения приложения
return (int)msg.wParam;
}
//
// ФУНКЦИЯ: MyRegisterClass()
//
// ЦЕЛЬ: Регистрирует класс окна.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEXW wcex; // Создаем структуру WNDCLASSEXW для описания класса окна
wcex.cbSize = sizeof(WNDCLASSEX);
// Устанавливаем стиль класса окна, который включает обработку событий перерисовки при изменении размеров
wcex.style = CS_HREDRAW | CS_VREDRAW;
// Указываем процедуру обработки сообщений для окна
wcex.lpfnWndProc = WndProc;
// Дополнительные данные класса окна (в данном случае не используются)
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
// Устанавливаем дескриптор приложения (инстанс)
wcex.hInstance = hInstance;
// Загружаем иконку для окна из ресурсов
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_LABA2N));
// Устанавливаем стандартный курсор для окна
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
// Устанавливаем фон окна (белый цвет)
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
// Загружаем меню для окна из ресурсов
wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_LABA2N);
// Указываем имя класса окна
wcex.lpszClassName = szWindowClass;
// Загружаем маленькую иконку для окна из ресурсов
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
// Регистрируем класс окна
return RegisterClassExW(&wcex);
}
//
// ФУНКЦИЯ: InitInstance(HINSTANCE, int)
//
// ЦЕЛЬ: Сохраняет маркер экземпляра и создает главное окно
//
// КОММЕНТАРИИ:
//
// В этой функции маркер экземпляра сохраняется в глобальной переменной, а также
// создается и выводится главное окно программы.
//
// Функция для инициализации экземпляра приложения
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // Сохраняем маркер экземпляра в глобальной переменной
// Создаем основное окно с указанным классом окна, заголовком и стилями
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_HSCROLL,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
// Проверяем успешность создания окна
if (!hWnd)
{
// Если создание окна не удалось, возвращаем FALSE для указания неудачной инициализации
return FALSE;
}
// Показываем основное окно
ShowWindow(hWnd, nCmdShow);
// Обновляем основное окно
UpdateWindow(hWnd);
// Возвращаем TRUE для указания успешной инициализации
return TRUE;
}
//
// ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// ЦЕЛЬ: Обрабатывает сообщения в главном окне.
//
// WM_COMMAND - обработать меню приложения
// WM_PAINT - Отрисовка главного окна
// WM_DESTROY - отправить сообщение о выходе и вернуться
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int Height; // Высота шрифта
static int Weight; // Толщина шрифта
HDC hdc; // Контекст устройства
TEXTMETRIC tm; // Структура, содержащая метрики текста
RECT rt; // Прямоугольник для работы с координатами
PAINTSTRUCT ps; // Структура для рисования
switch (message)
{
case WM_CREATE: // Сообщение при создании окна
{
hdc = GetDC(hWnd); // Получаем контекст устройства окна
// Извлекаем размеры шрифта из метрик текста
GetTextMetrics(hdc, &tm);
Height = tm.tmHeight;
Weight = tm.tmWeight;
// Освобождаем контекст устройства
ReleaseDC(hWnd, hdc);
break;
}
case WM_COMMAND:
{
// Получаем идентификатор команды из параметра wParam
int wmId = LOWORD(wParam);
// Разобрать выбор в меню:
switch (wmId)
{
case IDM_ABOUT:
// Открываем диалоговое окно "О программе"
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
// Завершаем выполнение приложения при выборе "Выход"
DestroyWindow(hWnd);
break;
default:
// Обработка команд по умолчанию
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
static POINT p;
static POINT p_lbutton;
char czBuffer[200];
// Обработка сообщения о перемещении мыши
case WM_MOUSEMOVE:
{
// Получаем текущие координаты курсора мыши
p.x = LOWORD(lParam);
p.y = HIWORD(lParam);
// Обновляем окно, чтобы нарисовать новое положение курсора
InvalidateRect(hWnd, NULL, TRUE);
break;
}
// Обработка сообщения о нажатии левой кнопки мыши
case WM_LBUTTONDOWN:
{
// Сохраняем текущие координаты курсора при нажатии левой кнопки мыши
p_lbutton.x = p.x;
p_lbutton.y = p.y;
// Обновляем окно
InvalidateRect(hWnd, NULL, TRUE);
break;
}
// Обработка сообщения о нажатии правой кнопки мыши
case WM_RBUTTONDOWN:
{
// Устанавливаем захват мыши
SetCapture(hWnd);
break;
}
// Обработка сообщения о отпускании правой кнопки мыши
case WM_RBUTTONUP:
{
// Освобождаем захват мыши
ReleaseCapture();
break;
}
// Обработка сообщений о нажатии клавиш клавиатуры
case WM_KEYDOWN:
{
switch (wParam)
{
case VK_RIGHT:
{
// Перемещение курсора вправо
GetCursorPos(&p);
p.x += 10;
SetCursorPos(p.x, p.y);
break;
}
case VK_LEFT:
{
// Перемещение курсора влево
GetCursorPos(&p);
p.x -= 10;
SetCursorPos(p.x, p.y);
break;
}
case VK_UP:
{
// Перемещение курсора вверх
GetCursorPos(&p);
p.y -= 10;
SetCursorPos(p.x, p.y);
break;
}
case VK_DOWN:
{
// Перемещение курсора вниз
GetCursorPos(&p);
p.y += 10;
SetCursorPos(p.x, p.y);
break;
}
default:
break;
}
break;
}
case WM_PAINT:
{
HDC hdc = BeginPaint(hWnd, &ps); // Получаем контекст устройства для рисования
int nHeight = 20; // Высота шрифта
int nWidth = 10; // Ширина шрифта
int nEscapement = 0; // Угол наклона шрифта
int nOrientation = 0; // Ориентация шрифта
int fnWeight = 40; // Толщина шрифта
HFONT hFont = CreateFont(nHeight, nWidth, nEscapement, nOrientation, fnWeight, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE);
SelectObject(hdc, hFont); //шрифт будет иметь силу только когда мы его выберем текущим
SelectObject(hdc, hFont); //Он будет иметь силу только когда мы его выберем
SetTextColor(hdc, RGB(0, 0, 0)); //зададим цвет текста
SetBkColor(hdc, RGB(255, 255, 255)); //зададим цвет фона
GetClientRect(hWnd, &rt); // Область вікна для малювання
TextOut(hdc, 10, 10, (LPCWSTR)czBuffer, wsprintf((LPWSTR)czBuffer, L"X = %5d Y = %5d ", (p.x - p_lbutton.x), (p.y - p_lbutton.y)));
TextOut(hdc, 10, 30, (LPCWSTR)czBuffer, wsprintf((LPWSTR)czBuffer, L"Ширина екрана в пикселях = %5d Висота екрана в пикселях = %5d Висота смуги прокрутки = %5d ", GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), GetSystemMetrics(SM_CYHSCROLL)));
TextOut(hdc, 10, 50, (LPCWSTR)czBuffer, wsprintf((LPWSTR)czBuffer, L"Ширина монитора(милиметри) = %5d Висота монитора(милиметри) = %5d ", GetDeviceCaps(hdc, HORZSIZE), GetDeviceCaps(hdc, VERTSIZE)));
TextOut(hdc, 10, 70, (LPCWSTR)czBuffer, wsprintf((LPWSTR)czBuffer, L"Висота шрифту = %5d ", nHeight));
TextOut(hdc, 10, 90, (LPCWSTR)czBuffer, wsprintf((LPWSTR)czBuffer, L"Ширина шрифту = %5d ", nWidth));
EndPaint(hWnd, &ps); // Завершаем рисование
DeleteObject(hFont); // Удаляем созданный шрифт
}
break;
case WM_DESTROY:
PostQuitMessage(0); // Завершаем приложение при уничтожении окна
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam); // Обработка остальных сообщений
}
return 0;
}
// Обработчик сообщений для окна "О программе".
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE; // Сообщение инициализации диалогового окна. Возвращает TRUE для указания, что обработчик успешно обработал сообщение.
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam)); // Завершение диалогового окна при нажатии кнопки OK или Cancel.
return (INT_PTR)TRUE; // Возвращение TRUE, чтобы указать успешное завершение обработки сообщения.
}
break;
}
return (INT_PTR)FALSE; // Возвращение FALSE, чтобы указать, что сообщение не было полностью обработано и нужно вызывать стандартную обработку сообщений.
}
Editor is loading...
Leave a Comment