0

我正在开发一个directX 应用程序,并且正在尝试设置一个窗口。但问题是我的窗口没有显示,而是显示我在创建窗口失败时创建的弹出窗口。我已经多次制作窗户,现在它无法正常工作。我在例程中唯一改变的是我将应用程序切换到 64 位应用程序而不是 32 位应用程序。我有一台 64 位计算机,它应该可以工作。

主文件

#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;
}

窗口.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();
};

窗口.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);
    }
}
4

1 回答 1

4

您的WNDCLASS结构包含未初始化的数据。您是否忽略了编译器警告?调用时不检查错误RegisterClass。很可能RegisterClass失败了,你无论如何都坚持下去。

确保WNDCLASS结构已初始化:

WNDCLASS windowClass = { 0 };

并在调用 Win32 API 函数时检查错误。在这里,检查返回的值RegisterClass。文档告诉您它的含义。

值得称赞的是,您至少检查了CreateWindow. 但是文档告诉你,在失败的情况下,调用GetLastError找出调用失败的原因。你没有那样做吗?我怀疑您最大的问题是您没有足够详细地阅读文档。

当您调用 时CreateWindow,您尝试m_Title作为窗口文本参数传递。编译器以类型不匹配错误反对。你用这个演员压制了这个错误:

(LPCWSTR)m_Title

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

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

于 2016-03-29T15:27:30.407 回答