簡體   English   中英

Win32窗口不顯示

[英]Win32 Window not displaying

我正在處理DirectX應用程序,並且正在嘗試設置一個窗口。 但是問題是我的窗口沒有顯示,而是顯示了當窗口創建失敗時我為之創建的彈出窗口。 我已經多次制作了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作為窗口文本參數傳遞。 編譯器反對類型不匹配錯誤。 您使用此強制轉換抑制了該錯誤:

(LPCWSTR)m_Title

現在, m_Titleconst char* 它不是const wchar_t* 沒有大量的鑄造就可以做到。 不要丟棄類型不匹配錯誤。 傳遞正確的類型。

調用CreateWindowA並傳遞m_Title ,或將m_Title更改為const wchar_t*類型。 如果執行后者,則需要傳遞一個寬文字,即L"Program"而不是"Program"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM