ウインドウが作れません!

[戻る]
やんまー 2006/05/25(木) 22:27:24
環境
OS:WindowsXP Professional SP2
使用ツール:Visual Stadio 2005

hWnd = CreateWindow( _TEXT("CLASS"),
                     _TEXT("TITLE"),
                     WS_OVERLAPPEDWINDOW,
                     CW_USEDEFAULT,
                     CW_USEDEFAULT,
                     CW_USEDEFAULT,
                     CW_USEDEFAULT,
                     NULL,
                     NULL,
                     hInst,
                     NULL );

ウインドウ表示するだけのプログラムを作っていたんですけど
ビルドは通るんですけどウインドウハンドルにNULLが返って
ウインドウが表示されません。↑の部分が原因だと思うんですけど
MSDNやネットで調べても原因がわかりません。
わかる方おしえていただけないでしょうか?よろしくお願いします。

シャノン 2006/05/25(木) 22:34:39
ウィンドウクラスは登録されていますか?

「ウィンドウクラスって何?」って場合は、こちら↓をどうぞ。
http://www.kumei.ne.jp/c_lang/index_sdk.html

ITO 2006/05/25(木) 22:37:01
何か本を読みながら作っていますか?

「ウインドウ表示するだけのプログラム」
の基本的な部分は、MSDNやネットでも詳しく
掲載していません。
本を読みながら作ることを勧めます。

Ban 2006/05/25(木) 22:41:48
原因特定には、GetLastError (調べてみて)を使うのも効果的です。

やんまー 2006/05/26(金) 07:10:19
やはり一部ではよくわからないと思うので全文載せます。
流れをみるとWinMainのIF文のとこでリターンされてしまいます。
長文、本当に申し訳ありません。

#include <windows.h>
#include <tchar.h>

LRESULT CALLBACK WinProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch(msg)
    {
    case WM_CLOSE:
        DestroyWindow(hWnd);
        break;
    case WM_KEYDOWN:
        if(wParam == 'Q'){
            DestroyWindow(hWnd);
        }
        break;
    default:
        DefWindowProc(hWnd, msg, wParam, lParam);
    }
    return (0L);
}

HWND 
InitWindow( HINSTANCE hInst)
{
    WNDCLASSEX wc;
    HWND       hWnd;

    wc.cbSize         = sizeof(wc);
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc     = WinProc;
    wc.cbClsExtra     = 0;
    wc.cbWndExtra     = 0;
    wc.hInstance     = hInst;
    wc.hIcon         = LoadIcon(NULL,IDI_WINLOGO);
    wc.hCursor         = LoadCursor(NULL,IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName     = NULL;
    wc.lpszClassName = _TEXT("CLASS");
    wc.hIconSm         = NULL;

    RegisterClassExW(&wc);

    hWnd = CreateWindow( _TEXT("CLASS"),
                              _TEXT("TITLE"),
                              WS_OVERLAPPEDWINDOW,
                              CW_USEDEFAULT,
                              CW_USEDEFAULT,
                              CW_USEDEFAULT,
                              CW_USEDEFAULT,
                              NULL,
                              NULL,
                              hInst,
                              NULL );
    return hWnd;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR 
lpCmdLine, int nCmdShow)
{
    MSG  msg;
    HWND hWnd;

    hWnd = InitWindow(hInstance);

    if( hWnd == NULL){
        return 0;
    }

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}

Blue 2006/05/26(金) 09:06:46
もう少し細かく調査してみてはどうでしょうか?
> RegisterClassExW(&wc);
は戻り値を返します。ここでここまでが成功しているか確認できます。
(なんでこれだけRegisterClassExWとWが明についているの?)
失敗している場合、BanさんからアドバイスがあったとおりGetLastErrorを使って
どのようなエラーが発生しているか確認します。

続いて、
> CreateWindow
でNULLを返したときも。GetLastErrorで確認します。


シャノンさんの紹介のサイトにVS2005向けのやつがありました。
参考にどうぞ。
http://www.kumei.ne.jp/c_lang/net2005/sample.htm

dairygoods 2006/05/26(金) 09:16:23
>    default:
>        DefWindowProc(hWnd, msg, wParam, lParam);
>    }
>    return (0L);

DefWindowProc の戻り値を返してないのが気になりますね。

Sugi 2006/05/26(金) 12:02:25
dairygoodsの指摘が原因だと思います。
WM_NCCREATEに対してDefWindowProcは非ゼロを返しているのに
上のソースではその値を返さず0を返しているためエラー扱いとなり
CreateWindowができないのでしょう
WinProcで呼び出したDefWindowProcの戻り値をWinProcが戻さなければ
既定処理の戻り値が呼び出し元に戻りませんね

Sugi 2006/05/26(金) 12:05:01
>dairygoodsの指摘
訂正 dairygoodsさんの指摘

コピペでそのまま書き込んでしまいました
dairygoodsさん大変失礼しました

やんまー 2006/05/26(金) 12:39:29
[[解決]]
dairygoodsさん、Sugiさんが指摘された

default:
    DefWindowProc(hWnd, msg, wParam, lParam);
    }
    return (0L);

の部分を言われた通りに

default:
    return DefWindowProc(hWnd, msg, wParam, lParam);
    }
    return (0L);

と修正したところウインドウ表示に成功しました。
ニアミスを見落としてました。
発言してくださった皆さん、ありがとうございました。

古いスレッドには追加発言できません。