Untitled

 avatar
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