Окно Win32 не отображается

Я работаю над приложением DirectX и пытаюсь настроить окно. Но проблема в том, что мое окно не отображается, а отображается всплывающее окно, которое я создал, когда окно не удается создать. Я сделал окна несколько раз, и теперь он не работает. Единственное, что я изменил в своей программе, это то, что я переключил свое приложение на 64-битное приложение вместо 32-битного. У меня есть 64-битный компьютер, и он должен работать.

main.cpp

#include "Render\window.h"
int CALLBACK WinMain(HINSTANCE appInstance, HINSTANCE prevInstance, LPSTR cmdLine, int cmdCount)
{
Window window("Program", 800, 600);

MSG msg = { 0 };
while (true)
{
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);

if (msg.message == WM_QUIT) break;
}
}

return 0;
}

window.h

#pragma once

#include <Windows.h>

class Window
{
private:
const char* const m_Title;
const int m_Width;
const int m_Height;
HWND m_Handler;
public:
Window(const char* title, int width, int height);

inline HWND GetHandler() const { return m_Handler; }
private:
void Init();
};

window.cpp

#include "window.h"
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
if (msg == WM_DESTROY || msg == WM_CLOSE)
{
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wparam, lparam);
}

Window::Window(const char* title, int width, int height)
: m_Title(title), m_Width(width), m_Height(height)
{
Init();
}

void Window::Init()
{
WNDCLASS windowClass;
windowClass.style = CS_OWNDC;
windowClass.lpfnWndProc = WinProc;
windowClass.hCursor = LoadCursor(nullptr, IDC_ARROW);
windowClass.lpszClassName = L"MainWindow";
RegisterClass(&windowClass);

m_Handler = CreateWindow(L"MainWindow", (LPCWSTR)m_Title, WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE, 100, 100, m_Width, m_Height, nullptr, nullptr, nullptr, nullptr);
if (m_Handler == 0)
{
MessageBox(nullptr, L"Problem with creating window!", L"Error", MB_OK);
exit(0);
}
}

0

Решение

Ваш WNDCLASS Структура содержит неинициализированные данные. Вы игнорируете предупреждения компилятора? Вы не проверяете ошибки при звонке RegisterClass, Вполне вероятно, что RegisterClass не удается, и вы нажимаете на независимо.

Убедитесь, что WNDCLASS структура инициализируется:

WNDCLASS windowClass = { 0 };

И проверять наличие ошибок при вызове функций Win32 API. Здесь, проверьте значение, возвращаемое RegisterClass, Документация говорит вам, что это значит.

На ваш счет вы хотя бы проверили значение, возвращаемое CreateWindow, Но в документации сказано, что в случае сбоя звоните GetLastError выяснить, почему звонок не удался. Вы этого не сделали? Я подозреваю, что ваша самая большая проблема в том, что вы не читаете документацию достаточно подробно.

Когда вы звоните CreateWindowты пытался пройти m_Title в качестве текстового аргумента окна. Компилятор возразил с ошибкой несоответствия типов. Вы подавили эту ошибку с этим приведением:

(LPCWSTR)m_Title

Сейчас, m_Title является const char*, Это не const wchar_t*, Никакое количество кастинга не делает это так. Не отбрасывайте ошибки несоответствия типов. Передайте правильный тип.

Либо позвони CreateWindowA и передать m_Titleили изменить m_Title быть типом const wchar_t*, Если вы сделаете последнее, вам нужно будет передать широкий литерал, L"Program" вместо "Program",

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]