Win32 Window 不显示

Win32 Window not displaying

我正在开发 directX 应用程序,我正在尝试设置 window。但问题是我的 window 没有显示,而是显示我在 window 无法创建时制作的弹出窗口。我做了 windows 多次,现在它不起作用了。我在例程中唯一改变的是我将我的应用程序切换到 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 作为 window 文本参数传递。编译器以类型不匹配错误表示反对。您通过此转换抑制了该错误:

(LPCWSTR)m_Title

现在,m_Titleconst char*。它不是 const wchar_t*。没有多少铸造可以做到这一点。不要丢弃类型不匹配错误。传递正确的类型。

要么调用 CreateWindowA 并传递 m_Title,要么将 m_Title 更改为 const wchar_t* 类型。如果你做后者,你需要传递一个宽文本,L"Program" 而不是 "Program".