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_Title
是 const char*
。它不是 const wchar_t*
。没有多少铸造可以做到这一点。不要丢弃类型不匹配错误。传递正确的类型。
要么调用 CreateWindowA
并传递 m_Title
,要么将 m_Title
更改为 const wchar_t*
类型。如果你做后者,你需要传递一个宽文本,L"Program"
而不是 "Program"
.
我正在开发 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_Title
是 const char*
。它不是 const wchar_t*
。没有多少铸造可以做到这一点。不要丢弃类型不匹配错误。传递正确的类型。
要么调用 CreateWindowA
并传递 m_Title
,要么将 m_Title
更改为 const wchar_t*
类型。如果你做后者,你需要传递一个宽文本,L"Program"
而不是 "Program"
.