Win32窗口立即关闭

时间:2014-03-07 19:44:58

标签: c++ winapi window

我试图通过我的应用程序显示一个简单的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不会继承或实现另一个类。

1 个答案:

答案 0 :(得分:0)

我发现了问题所在。可悲的是,因为我认为这不重要,所以我没有把这行代码放在我的问题中。 问题是类的初始化,因为我没有定义复制构造函数。

Window mainWindow = Window(...)

导致窗口实例获得Unregistered,因为在复制构造函数复制对象后,原始对象被破坏,我在析构函数中调用了UnregisterClass(..)

使用:

 Window mainWindow(..)

修复了问题。