Не создается окно на WinAPI
При работе с кодом все идет нормально. При сборке ошибок компилятора нет. Однако само окно не создается, хотя когда копирую код из интернета, вставляю и запускаю все нормально. Проблема может быть с инициализацией класса или с самим окном(CreateWindow). Вот код для просто создания окна:
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE app, HINSTANCE hPrev, LPSTR ipCmdLine, int nCmdShow)
{
HWND window;
MSG msg;
TCHAR ClassName[] = L"MyClass";
WNDCLASSEX wc;
wc.cbSize = sizeof(wc);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.lpszMenuName = NULL;
wc.lpszClassName = ClassName;
wc.cbWndExtra = NULL;
wc.cbClsExtra = NULL;
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
// Тоже проверка. Всё может тут и закончиться
if (!RegisterClassEx(&wc))
{
MessageBox(NULL, L"Ошибка: Не зарегистрировался класс!", L"Ошибка!", MB_ICONEXCLAMATION | MB_OK);
return NULL;
}
// Создание самого окна
window = CreateWindow(
ClassName,
L"Тест",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
NULL,
CW_USEDEFAULT,
NULL,
HWND_DESKTOP,
NULL,
app,
NULL
);
// Проверка. Именно тут все и заканчивается
if (!window)
{
MessageBox(NULL, L"Ошибка: Не создалось окно!", L"Ошибка", MB_ICONEXCLAMATION | MB_OK);
return NULL;
}
ShowWindow(window, nCmdShow);
UpdateWindow(window);
while (GetMessage(&msg, NULL, NULL, NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return NULL;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(NULL);
break;
default:
DefWindowProc(hWnd, message, wParam, lParam);
}
return NULL;
}
P.S.: Тут проблема с окном
Ответы (2 шт):
При работе с WinAPI, нужно проверять не только на валидность значений которые возвращают функции, но и вызывать GetLastError, что бы получить дополнительную информацию о том, что пошло не так, и почему функция вернула данные NULL.
Ниже, просто исправленный код...
P.S. Код на си, т.к. мне не вариант было переключать компилятор ради исправления ошибок.
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <stdio.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE app, HINSTANCE hPrev, LPSTR ipCmdLine, int nCmdShow)
{
(void)ipCmdLine;
(void)hPrev;
HWND window = NULL;
MSG msg = {0};
TCHAR ClassName[] = __TEXT("MyClass");
DWORD error_code = 0UL;
char error_buffer[1024] = {0};
WNDCLASSEX wc = {0};
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = ClassName;
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
// Тоже проверка. Всё может тут и закончиться
if (!RegisterClassEx(&wc))
{
error_code = GetLastError();
sprintf(error_buffer, "GetLastError(): Error Code %lu", error_code);
OutputDebugStringA(error_buffer);
MessageBox(NULL, __TEXT("Ошибка: Не зарегистрировался класс!"), __TEXT("Ошибка!"), MB_ICONEXCLAMATION | MB_OK);
return 1;
}
// Создание самого окна
window = CreateWindowA(
ClassName,
__TEXT("Test"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
HWND_DESKTOP,
NULL,
app,
NULL);
// Проверка. Именно тут все и заканчивается
if (!window)
{
sprintf(error_buffer, "GetLastError(): Error Code %lu", error_code);
OutputDebugStringA(error_buffer);
MessageBox(NULL, __TEXT("Ошибка: Не создалось окно!"), __TEXT("Ошибка"), MB_ICONEXCLAMATION | MB_OK);
return 2;
}
ShowWindow(window, nCmdShow);
UpdateWindow(window);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0LL;
}
ヒミコ@DESKTOP-T4M5L89 MINGW64 /d/some/build
$ make some
[ 50%] Building C object CMakeFiles/some.dir/main.c.obj
[100%] Linking C executable some.exe
[100%] Built target some
ヒミコ@DESKTOP-T4M5L89 MINGW64 /d/some/build
$ ./some.exe
ヒミコ@DESKTOP-T4M5L89 MINGW64 /d/some/build
$ echo $?
0
Создайте новый пустой проект(файл->создать->проект->Visual C++->Пустой проект), и вручную добавьте main.cpp и напиши заново код.