- 締切済み
CreateWindowの方法
VisualC++ Express 2010 をインストールして 空のプロジェクトを作成し ウィンドウを作成するための、下記のソースコードを作成したのですが CreateWindow関数の戻り値が0になり、ウィンドウを作成することが 出来ません。 OSは、Windows7 Home Premium 32bit 版です。 ウィンドウを作成するには、どうすればよいのかご教示ください。 また、現象の発生理由をご存じのかたがいらっしゃればご教示ください。 --- ソースコードここから --- #include "windows.h" LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrecInstance, LPSTR lpCmdLine, int nCmdShow ) { WNDCLASSEX wcex; HWND hWnd; MSG msg; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(NULL,IDI_APPLICATION); wcex.hCursor = LoadCursor(NULL , IDC_ARROW); wcex.lpszMenuName = NULL; wcex.lpszClassName = "ModelApp"; wcex.hIconSm = LoadIcon(NULL,IDI_APPLICATION); RegisterClassEx(&wcex); hWnd = CreateWindow(wcex.lpszClassName, "Windows", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); (以下略) }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Wr5
- ベストアンサー率53% (2173/4061)
>RegisterClassEX()関数の後で >iRet2 = GetLastError(); >とすると、戻り値の値が87となっておりました。 「パラメータが間違っています。」です。 プロジェクトのプロパティで、文字コードセットはどうなっていますか? >wcex.lpszClassName = "ModelApp"; >"Windows", という指定だと、「マルチバイト文字セットを使用する」でないと エラー(ワーニング?)になる…ハズですが。 # error C2440: '=' : 'const char [9]' から 'LPCWSTR' に変換できません。 # とか。 あとは…hbrBackgroundメンバが未設定…のようです。 不定値でヘンなのが入っていて失敗している可能性もあるかも知れません。 ZeroMemory()でクリアしておく…というのもアリでしょう。 # 少なくとも不定値にはなりませんし。 WHITE_BRUSHになるかな。
- Wr5
- ベストアンサー率53% (2173/4061)
WndProc()の中身はどうなっていますか? 最低限、DefWindowProc()に飛ばしたりしておく必要がありますけど…。 RegisterClassEx()がエラー返却していたりしないですか? GetLastError()ではなんと言っていますかね?
お礼
返信いただき、ありがとうございました。 WndProc()の中身は下記のソースコードの通りです。 DefWindowProc()関数を呼び出してはおります。 RegisterClassEX()関数の戻り値を確認したところ 0が帰ってきておりました。 登録に失敗しているということでしょうか。 RegisterClassEX()関数の後で iRet2 = GetLastError(); とすると、戻り値の値が87となっておりました。 --- WndProc関数の内部 --- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hWnd, message, wParam, lParam); } }
お礼
hbrBackground = WHITE_BRUSH と設定したところ RegisterClassEX()の戻り値が0以外の値が帰ってきて 空のウィンドウを生成することができました。 ご教示いただきまして、ありがとうございました。