我试图通过我的应用程序显示一个简单的win32窗口,但窗口没有显示出来。该程序立即退出,因为通过消息泵发送了WM_DESTROY
消息。
以下是相关代码:
WNDCLASSEX wClass; //window class structur
wClass.hInstance = appInstance;
wClass.lpszClassName = CLASSNAME;
wClass.lpfnWndProc = WindowProc;
wClass.style = CS_HREDRAW | CS_VREDRAW;
wClass.cbSize = sizeof(WNDCLASSEX);
wClass.hIcon = NULL;
wClass.hCursor = LoadCursor(NULL, IDC_ARROW);
wClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wClass.lpszMenuName = NULL;
wClass.hbrBackground = NULL;
wClass.cbClsExtra = 0;
wClass.cbWndExtra = 0;
if (!RegisterClassEx(&wClass))
{
Debug::getInstance().log("Faild to create Window Class", EDEBUG_LEVEL::E_ERROR);
//throw some errors
return;
}
windowHandle = CreateWindowEx(
NULL,
CLASSNAME,
title.c_str(), //real window title
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
position.x, position.y,
size.x, size.y,
NULL,
NULL,
appInstance,
NULL
);
if (windowHandle == NULL)
{
Debug::getInstance().log("CreateWindow failed.", EDEBUG_LEVEL::E_ERROR);
}
在此代码中,appInstance
是来自条目WinMain
函数的hInstance。我已经调试了这段代码,但这里似乎没有任何问题。
这是我的WndProc:
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// sort through and find what code to run for the message given
switch (message)
{
// this message is read when the window is closed
case WM_DESTROY:
{
// close the application entirely
PostQuitMessage(0);
return 0;
} break;
}
// Handle any messages the switch statement didn't
return DefWindowProc(hWnd, message, wParam, lParam);
}
我的消息泵:
while (TRUE) {
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if (msg.message == WM_QUIT) {
break;
}
}
调试WndProc
函数后,我发现在WM_DESTROY
和0x0090之后发送WM_CREATE
(我无法找到这意味着什么)。
我做错了什么?
哦忘了提。在我创建窗口后,这也会被执行:
ShowWindow(windowHandle, SW_SHOW);
UpdateWindow(windowHandle);
SetFocus(windowHandle);
编辑:经过进一步调查后,我发现问题似乎是由构造函数调用窗口构建方法引起的:
Window::Window(HINSTANCE thisInstance, DirectX::XMINT2 size, wstring title, bool enableFullscreen) :
appInstance(thisInstance),
position(0, 0),
size(size),
#ifdef UNICODE
title(title),
#else
title(string(title.begin(), title.end())),
#endif
fullscreen(false)
{
this->buildWindow();
if (fullscreen)
setFullscreenWindowed(true);
}
虽然this->buildWindow()
是我发布的第一个代码。如果我从另一个类调用buildWindow()
作为公共成员方法,它就可以正常工作。
这有什么不对?它不是虚拟功能。 Window不会继承或实现另一个类。
答案 0 :(得分:0)
我发现了问题所在。可悲的是,因为我认为这不重要,所以我没有把这行代码放在我的问题中。 问题是类的初始化,因为我没有定义复制构造函数。
Window mainWindow = Window(...)
导致窗口实例获得Unregistered,因为在复制构造函数复制对象后,原始对象被破坏,我在析构函数中调用了UnregisterClass(..)
。
使用:
Window mainWindow(..)
修复了问题。