Создаем движок на WinApi & Directx11 часть 1(перевыпуск)

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Я учел ошибки которые допустил в прошлой статье.Сегодня будет лучше


Привет всем! Сегодня создадим простое окно WinApi


  • Озу: 1-5гб version: 2017-2022

  • Виндовс: 7+ version 2017-2019.10+ version 2022


Чтобы начать надо установить winsdk и сделать новый проект

и ставим компоновщик->система->подсистема->не задано

такие настройки

теперь приступаем.

Включаем необходимые заголовочные файлы и определяем имя класса окна

#include <Windows.h>

// Имя класса окна
const wchar_t* g_WindowClassName = L"MyWin32WindowClass";

Делаем прототип WindowsProc и вместе создаем функцию создания окна

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);


bool CreateAndShowWindow(HINSTANCE hInstance, int nCmdShow)
{
  // Регистрируем класс окна
  WNDCLASSEX wcex = { sizeof(WNDCLASSEX) }; // заполняем wcex.style чтобы при изменении размера окно коректно отображалось
  wcex.lpfnWndProc = WindowProc;  //функция обработки сообщений окна
  wcex.hInstance = hInstance; //  функция создания и отображения окна
  wcex.hCursor = LoadCursor(NULL, IDC_ARROW); // подргужаем курсор
  wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); //делаем задний фон окна
  wcex.lpszClassName = g_WindowClassName; // назрначаем имя класса
}
Зачем нам прототип WindowProc

Прототип функции WindowProc определяется для того, чтобы компилятор знал о существовании этой функции и правильно обрабатывал вызовы этой функции в коде приложения.

WindowProc - это функция обратного вызова (callback function), которая будет вызываться операционной системой для обработки сообщений, связанных с окном приложения. Когда происходят события, такие как нажатие кнопок мыши или закрытие окна, операционная система генерирует соответствующие сообщения и передает их в функцию WindowProc для обработки.

Определение прототипа функции WindowProc позволяет компилятору правильно распознать сигнатуру функции, то есть типы и порядок параметров, чтобы функция корректно использовалась в коде.

Таким образом, объявление прототипа WindowProc обеспечивает правильное связывание и обработку сообщений окна приложения.

далее нам надо проверить,зарегестрировалось ли окно или нет? И еще создать окно.

{
      if (!RegisterClassEx(&wcex))
      {
        MessageBox(NULL, L"Failed to register window class.", L"Error", MB_OK | MB_ICONERROR);
        return false;
      }
}

а,да! забыл прописуем в include следущее :

{
  // Расчет позиции и размеров окна
    int windowWidth = 800;
    int windowHeight = 600;
    

    // Создание окна
    HWND hwnd = CreateWindowEx
    (
      0,                          // Дополнительные стили окна
      g_WindowClassName,          // Имя класса окна
      L"My WinAPI Window",        // Заголовок окна
      WS_OVERLAPPEDWINDOW,        // Стили окна
      0,                    // Позиция по оси X
      0,                    // Позиция по оси Y
      windowWidth,                // Ширина окна
      windowHeight,               // Высота окна
      NULL,                       // Родительское окно
      NULL,                       // Меню окна
      hInstance,                  // Дескриптор экземпляра модуля
      NULL                        // Параметры создания окна
    );

    //когда не удалось создать окно то:
    if (!hwnd)
    {
        MessageBox(NULL, L"Failed to create window.", L"Error", MB_OK | MB_ICONERROR);
        return false;
    }

    // Отображение окна
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    return true;
}

Нам надо сделать основную функцию

которая запустит приложение

// Основная функция приложения
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    // Создание и отображение окна
    if (!CreateAndShowWindow(hInstance, nCmdShow))
        return 1;

    // Главный цикл обработки сообщений
    MSG msg = {};
    while (msg.message != WM_QUIT)
    {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            // Обработка логики приложения
        }
    }

    return (int)msg.wParam;
}

функцию обработки сообщений надо еще... конечно же чтобы мы могли обрабатывать сообщения?

// Функция обработки сообщений окна
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_CLOSE:
        PostQuitMessage(0); // закрываем приложение
        return 0;
    }

    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

запускаем на F5 и видим магию!

Вот.... ну что пока всем! 18 июня постараюсь сделать 2 часть

Источник: https://habr.com/ru/articles/741940/


Интересные статьи

Интересные статьи

Несколько недель назад в блоге «.NET Blog» появилась статья «Что такое .NET, и почему вы должны выбрать его?». В нем был представлен высокоуровневый обзор платформы, кратко описаны различные компонен...
“Serverless” — это популярный в наши дни технический термин, который означает не совсем то, что мы думаем, когда его слышим. Это потому, что сервер все таки есть — на нем размещены эти самые бессервер...
Привет! Я Павел Щеваев, CTO студии BIT.GAMES, части MY.GAMES. Вы можете знать нас по таким играм, как «Гильдия Героев» и «Домовята» в Одноклассниках (да, это тоже были мы), а также по нашему текущему ...
С 2020 года мы выстраиваем платформенный подход к разработке продуктов. Мы сформировали набор технологий, которые должны распространиться на все наши команды, чтобы в масштабе всей компании мы могли ц...
Первая версия технического задания системы питания кубсата. Читать далее