Я работаю над приложением 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);
}
}
Ваш 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"
,
Других решений пока нет …