質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.12%

何が原因?RegisterClassExが0を出す

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 403

Negligible-n

score 18

こんばんは
今、WNDCLASSEXから作ったwcexをRegisterClassExしているのですが、何度やっても失敗します。以下の3つのファイルからなっています。

WinMain.cpp

#include<windows.h>
#include"D3DAPP.h"

class testApp :public d3DApp {
public:
    //Constructor
    testApp(HINSTANCE hInstance);
    //Destructor
    ~testApp();

    //Methods

    bool init() override;
    void update(float dt) override;
    void render() override;
}; 

testApp::testApp(HINSTANCE hInstance) :d3DApp(hInstance) {

}

testApp::~testApp() {

}

bool testApp::init() {
    if (!d3DApp::init()) {
        return false;
    }

    return true;
}

void testApp::update(float dt) {

}

void testApp::render() {

}

int WINAPI WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow) {

    testApp* tApp = new testApp(hInstance);

    if (!tApp->init()) {
        return 1;
    }

    return tApp->run();

}

D3DApp.h

#include<windows.h>
#include<d3d9.h>
#include<d3dx9.h>

class d3DApp {
public:
    //Constructor
    d3DApp(HINSTANCE hInstance);

    //destructor
    virtual ~d3DApp();

    //Main application loop
    int run();

    //Framework methods
    virtual bool init();
    virtual void update(float dt) = 0;
    virtual void render() = 0;
    LRESULT msgProc(HWND hwnd, UINT msg, WPARAM aParam, LPARAM lParam);

protected:
    //Attributes
    HWND         m_hAppWindow;
    HINSTANCE    m_hAppInstance;
    unsigned int m_uiClientWidth;
    unsigned int m_uiClientHeight;
    LPCWSTR  m_sAppTitle;
    DWORD        m_WindowStyle;

    //methods

    //Initialize the app window
    bool initWindow();

    //Initialize Direct3D
    bool initDirect3D();
};

D3DApp.cpp

#include"D3DApp.h"

namespace {
    //Create a global pointer to d3DApp
    d3DApp* g_pd3DApp;
}

LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    //Foward the messages
    return g_pd3DApp->msgProc(hwnd, msg, wParam, lParam);
}

d3DApp::d3DApp(HINSTANCE hInstance) {
    m_hAppWindow = NULL;
    m_hAppInstance = hInstance;
    m_uiClientWidth = 800;
    m_uiClientHeight = 600;
    m_sAppTitle = (LPCWSTR)TEXT("DIRECTX9 App");
    m_WindowStyle = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;
}

d3DApp::~d3DApp() {
    //Release object from memory
}

int d3DApp::run() {
    //Main message loop
    MSG msg = { 0 };
    while (WM_QUIT != msg.message) {
        if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        } else {
            //Update
            update(0.0f);
            //Render
            render();
        }
    }

    return static_cast<int>(msg.wParam);

}

bool d3DApp::init() {
    //Check window creation
    if (!initWindow()) {
        return false;
    }

    //Check Direct3D initilization
    if (!initDirect3D()) {
        return false;
    }

    return true;
}

bool d3DApp::initWindow() {
    //Create WNDCLASS
    WNDCLASSEX wcex;
    static LPCWSTR classNameLPCWSTR = (LPCWSTR)TEXT("D3DAPPWNDCLASS");
    ZeroMemory(&wcex, sizeof(WNDCLASSEX));
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.cbSize = sizeof(WNDCLASS);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.hInstance = m_hAppInstance;
    wcex.lpfnWndProc = MainWndProc;
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = classNameLPCWSTR;
    wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    //Register that class
    if (!RegisterClassEx(&wcex)) {
        MessageBox(NULL, (LPCWSTR)TEXT("Failed to register window class"), NULL, NULL);
        return false;
    }

    //Cache requested width, height
    RECT r = { 0,0,m_uiClientWidth,m_uiClientHeight };
    AdjustWindowRect(&r, m_WindowStyle, false);
    int width = r.right - r.left;
    int height = r.top - r.bottom;

    //Create the window
    m_hAppWindow = CreateWindow(
        (LPCWSTR)TEXT("D3DAPPWNDCLASS"),
        m_sAppTitle,
        m_WindowStyle,
        GetSystemMetrics(SM_CXSCREEN) / 2 - width / 2,
        GetSystemMetrics(SM_CYSCREEN) / 2 - height / 2,
        width,
        height,
        NULL,
        NULL,
        m_hAppInstance,
        NULL);

    //Check if window was created
    if (!m_hAppWindow) {
        MessageBox(NULL, (LPCWSTR)TEXT("Failed to create window"), NULL, NULL);
        return false;
    }

    //Show the window
    ShowWindow(m_hAppWindow, SW_SHOW);

    return true;
}

bool d3DApp::initDirect3D() {
    return true;
}

LRESULT d3DApp::msgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch (msg) {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }

    return DefWindowProc(hwnd, msg, wParam, lParam);
}

海外の古いYouTubeから引っ張ってきたので、(URL:https://youtu.be/Il6jySpR3VI)今VS2019でやっているので。。。

現状はちょうどRegisterClassExの部分で、0が出てきてしまっています。

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Negligible-n

    2019/06/11 23:20

    長くてすみません

    キャンセル

回答 2

checkベストアンサー

+1

wcex.cbSize = sizeof(WNDCLASS);


これが、こうですね。

wcex.cbSize = sizeof(WNDCLASSEX);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/11 23:58

    ありがとうございます!

    キャンセル

+1

RegisterClassExを使う場合はWNDCLASSEXが必要だけど、cbSizeがsizeof(WNDCLASS)になっているからEXとして認識されないので失敗、ということじゃないかな?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/11 23:57

    ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る