ウインドウが作れません! – プログラミング – Home

ウインドウが作れません!
 
通知
すべてクリア

[解決済] ウインドウが作れません!


やんまー
 やんまー
(@やんまー)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

環境
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やネットで調べても原因がわかりません。
わかる方おしえていただけないでしょうか?よろしくお願いします。


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

ウィンドウクラスは登録されていますか?

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


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

何か本を読みながら作っていますか?

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


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

原因特定には、GetLastError (調べてみて)を使うのも効果的です。


返信引用
やんまー
 やんまー
(@やんまー)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

やはり一部ではよくわからないと思うので全文載せます。
流れをみると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
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

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

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

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


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

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

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


返信引用
Sugi
 Sugi
(@Sugi)
ゲスト
結合: 19年前
投稿: 20
 

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


返信引用
Sugi
 Sugi
(@Sugi)
ゲスト
結合: 19年前
投稿: 20
 

>dairygoodsの指摘
訂正 dairygoodsさんの指摘

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


返信引用
やんまー
 やんまー
(@やんまー)
ゲスト
結合: 19年前
投稿: 3
Topic starter  

dairygoodsさん、Sugiさんが指摘された

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

の部分を言われた通りに

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました