Untitled
unknown
c_cpp
a year ago
16 kB
10
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