c++ - 无法使用 WinAPI 显示窗口

标签 c++ windows winapi directx

我知道这是一个无聊的问题,我以前已经做过一百万次了,但是我无法在我编写的 WinAPI 程序中显示一个简单的窗口。它后来使用 DirectX 在窗口上绘制,但我已经调试了程序,它甚至在所有 DirectX 东西开始执行之前就无法显示窗口。我只看到任务栏上的程序图标,但没有窗口。

这是一段处理窗口创建的代码。

WNDCLASSEX wc;
    ZeroMemory(&wc, sizeof(wc));
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WndProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = title.c_str();
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hIcon = 0;
    wc.hIconSm = 0;
    wc.hbrBackground = 0;
    wc.lpszMenuName = 0;

    if(!RegisterClassEx(&wc))
    {
        debug << "Failed to register window class." << std::endl;
        return 0;
    }

    DWORD dwStyle, dwExStyle;
    dwStyle = WS_OVERLAPPEDWINDOW | WS_VISIBLE;
    dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;

    AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle);

    int wwidth = windowRect.right - windowRect.left;
    int wheight = windowRect.bottom - windowRect.top;

    debug << "Screensize: " << wwidth << "x" << wheight << std::endl;
    debug << "Creating program window..." << std::endl;

    HWND hWnd = CreateWindowExW(dwExStyle, wc.lpszClassName, title.c_str(), dwStyle | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0, 0, wwidth, wheight, NULL, NULL, hInstance, 0); 

    if(!hWnd)
    {
        debug << "Error occured while trying to display the window.\n";
        return false;
    }

    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);

我很绝望。我开始觉得我的编程环境、库等有问题。我使用的是 VS2012/Win7,以及 VS 附带的标准 c++ 编译器。

编辑 WindowRect 在这里

RECT windowRect;
    windowRect.left = 0;
    windowRect.right = g_engine->getScreenWidth(); //800
    windowRect.top = 0;
    windowRect.bottom = g_engine->getScreenHeight(); //600

这是 DefWindowProc

LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if(msg == WM_DESTROY)
    return DefWindowProc(hWnd, msg, wParam, lParam);
}

最佳答案

我遇到这个问题的大部分时间是 WinProc 的错误返回值。

您的 WinProc 可能会调用 DefWndProc 而不会返回其返回值。 这使得 WM_NCCREATE 被视为返回 false(而不是 true,它应该如此),导致创建过程停止。

一个合适的windowproc应该是

LRESULT CALLBACK WndProc (HWND h, UINT u, WPARAM w, LPARAM l)
{
  if(...) {}
  else if(...) {}
  else if(...) {} //prematurely return if you don't want the default behavior

  return DefWndProc(h,u,w,l);
}

关于c++ - 无法使用 WinAPI 显示窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14780716/

相关文章:

windows - 如何在 Windows 中从命令行暂停/恢复正在运行的程序?

c++ - MessageBox 从 TCHAR 缓冲区打印额外的 unicode 字符

c++ - 我应该在 C++ 字符串文字上使用 _T 还是 _TEXT ?

c++ - SFINAE:有些失败比其他失败更平等?

c - 从 Linux 执行 powershell 脚本

c++ - 头文件中定义的线程函数给​​出类型转换错误

windows - 从计算机名称列表中获取登录用户

c++ - Win32 API 事件 - 在不同进程的访问方面有哪些限制?

c++ - HLSL 和 DX Skybox 问题(产生接缝)

c++ - 如何为 Visual Studio 2010 构建 Qt