Я учел ошибки которые допустил в прошлой статье.Сегодня будет лучше
Привет всем! Сегодня создадим простое окно 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 часть
Lex20
Прописуем это как? Прописываем и суём?
Осмелюсь порекомендовать вам мою инструкцию для начинающих в c, winapi и прочем opengl. https://www.youtube.com/watch?v=jrJIFKF6o7E