環境
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やネットで調べても原因がわかりません。
わかる方おしえていただけないでしょうか?よろしくお願いします。
何か本を読みながら作っていますか?
「ウインドウ表示するだけのプログラム」
の基本的な部分は、MSDNやネットでも詳しく
掲載していません。
本を読みながら作ることを勧めます。
原因特定には、GetLastError (調べてみて)を使うのも効果的です。
やはり一部ではよくわからないと思うので全文載せます。
流れをみると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;
}
もう少し細かく調査してみてはどうでしょうか?
> RegisterClassExW(&wc);
は戻り値を返します。ここでここまでが成功しているか確認できます。
(なんでこれだけRegisterClassExWとWが明についているの?)
失敗している場合、BanさんからアドバイスがあったとおりGetLastErrorを使って
どのようなエラーが発生しているか確認します。
続いて、
> CreateWindow
でNULLを返したときも。GetLastErrorで確認します。
シャノンさんの紹介のサイトにVS2005向けのやつがありました。
参考にどうぞ。
http://www.kumei.ne.jp/c_lang/net2005/sample.htm
> default:
> DefWindowProc(hWnd, msg, wParam, lParam);
> }
> return (0L);
DefWindowProc の戻り値を返してないのが気になりますね。
dairygoodsの指摘が原因だと思います。
WM_NCCREATEに対してDefWindowProcは非ゼロを返しているのに
上のソースではその値を返さず0を返しているためエラー扱いとなり
CreateWindowができないのでしょう
WinProcで呼び出したDefWindowProcの戻り値をWinProcが戻さなければ
既定処理の戻り値が呼び出し元に戻りませんね
>dairygoodsの指摘
訂正 dairygoodsさんの指摘
コピペでそのまま書き込んでしまいました
dairygoodsさん大変失礼しました
dairygoodsさん、Sugiさんが指摘された
default:
DefWindowProc(hWnd, msg, wParam, lParam);
}
return (0L);
の部分を言われた通りに
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return (0L);
と修正したところウインドウ表示に成功しました。
ニアミスを見落としてました。
発言してくださった皆さん、ありがとうございました。