0

私は directX アプリケーションに取り組んでおり、ウィンドウをセットアップしようとしています。しかし、問題は、ウィンドウの作成に失敗したときに作成したポップアップを表示する代わりに、ウィンドウが表示されないことです。ウィンドウを複数回作成しましたが、現在は機能していません。ルーチンで唯一変更したことは、アプリケーションを 32 ビット アプリケーションではなく 64 ビット アプリケーションに切り替えたことです。私は 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();
};

ウィンドウ.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);
    }
}
4

1 に答える 1

4

構造WNDCLASS体に初期化されていないデータが含まれています。コンパイラの警告を無視していますか? を呼び出すときにエラーをチェックしませんRegisterClass。それが失敗する可能性が非常に高く、RegisterClass関係なく押し続けます。

WNDCLASS構造体が初期化されていることを確認します。

WNDCLASS windowClass = { 0 };

また、Win32 API 関数を呼び出すたびにエラーをチェックしてください。ここで、 によって返される値を確認しますRegisterClass。ドキュメントには、それが何を意味するかが記載されています。

あなたの名誉のために、あなたは少なくとも によって返された値をチェックしましたCreateWindow。しかし、ドキュメントによると、失敗した場合は、 を呼び出しGetLastErrorて、呼び出しが失敗した理由を調べてください。あなたはそれをしませんでしたか?あなたの最大の問題は、ドキュメントを十分に詳しく読んでいないことだと思います。

を呼び出すときに、ウィンドウ テキスト引数としてCreateWindow渡そうとしました。m_Titleコンパイラは、型の不一致エラーでオブジェクトを返しました。このキャストでそのエラーを抑制しました:

(LPCWSTR)m_Title

さて、m_Titleですconst char*。そうではありませんconst wchar_t*。いくらキャストしてもそうなりません。型の不一致エラーをキャストしないでください。正しい型を渡します。

を呼び出しCreateWindowAて渡すか、タイプを にm_Title変更します。後者を行う場合は、代わりにワイド リテラルを渡す必要があります。m_Titleconst wchar_t*L"Program""Program"

于 2016-03-29T15:27:30.407 に答える