ウインドウを表示したいのですが
実行した瞬間に終わってしまいます。
何が間違えているのか教えて頂けないでしょうか?
Windowsが速攻で終わってしまう
Re:Windowsが速攻で終わってしまう
メッセージループがないからです。
ウインドウを折角つくっても、そのまま「とりあえず0を返して」アプリを
終了させてしまっていますよ。
3章 Windowsアプリケーションの骨格(その1)
ttp://web.kyoto-inet.or.jp/people/ysskondo/chap3.html
ウインドウを折角つくっても、そのまま「とりあえず0を返して」アプリを
終了させてしまっていますよ。
3章 Windowsアプリケーションの骨格(その1)
ttp://web.kyoto-inet.or.jp/people/ysskondo/chap3.html
Re:Windowsが速攻で終わってしまう
実行したプログラムがすぐに終わるのですか?
それとも、Windows(オペレーティングシステム)がすぐに終了してしまうのですか?
前者ならJustyさんのご指摘どおりです。
後者なら別の理由が考えられます。
それとも、Windows(オペレーティングシステム)がすぐに終了してしまうのですか?
前者ならJustyさんのご指摘どおりです。
後者なら別の理由が考えられます。
Re:Windowsが速攻で終わってしまう
原因は、すぐreturn(0)のところに行ってしまうからですね。 return(0)の前に、こちらの入力を待つ関数などを挟めばいいと思います。 もしくは無限ループにし、条件に応じてbreak。 -------------------------------------------------------------------------------------------------- #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // ウィンドウプロシージャ HINSTANCE hInst;// インスタンス HWND hWnd; // ウィンドウハンドル HDC hDC_Wnd; // ウィンドウのデバイスコンテキスト //============================================================================================== // Windows メイン処理 //============================================================================================== INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ // ウィンドウクラスの登録 WNDCLASS wc; // windows.hにあるウインドウの情報を入れることができる変数 ZeroMemory(&wc, sizeof(WNDCLASS)); // 構造体で作ったwcの変数をすべて0で初期化 wc.style = CS_HREDRAW | CS_VREDRAW; // ウィンドウスタイル wc.lpfnWndProc = (WNDPROC)WndProc; // ウィンドウプロシージャ wc.cbClsExtra = 0; // 補助領域サイズ wc.cbWndExtra = 0; // 補助領域サイズ wc.hInstance = hInstance; // インスタンスハンドル wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // アイコン wc.hCursor = LoadCursor(NULL, IDC_ARROW); // マウスカーソル wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // クライアント領域背景色 wc.lpszMenuName = NULL; // ウィンドウメニュー wc.lpszClassName = TEXT("Windows"); // ウィンドウクラス名 if(!RegisterClass(&wc)) return 0; // ウィンドウの作成 hWnd = CreateWindow( wc.lpszClassName, // ウィンドウクラス名 TEXT("タイトル"), // ウィンドウタイトル WS_OVERLAPPEDWINDOW, // ウィンドウスタイル 300, // 表示X座標 200, // 表示Y座標 640, // 幅 480, // 高さ NULL, // 親ウィンドウ NULL, // ウィンドウメニュー hInstance, // インスタンスハンドル NULL); // WM_CREATE情報 // ウィンドウの表示 ShowWindow(hWnd, nCmdShow); // 表示状態の設定 UpdateWindow(hWnd); // クライアント領域の更新 hInst = hInstance; hDC_Wnd = GetDC(hWnd); ReleaseDC(hWnd,hDC_Wnd); MessageBox(hWnd, TEXT("OKボタンで終了"),TEXT("動作テスト"),MB_OK); return 0; // とりあえず0を返す } //============================================================================================== // ウィンドウプロシージャ //============================================================================================== LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){ switch(msg){ case WM_DESTROY: // ウィンドウが破棄されたときの処理 PostQuitMessage(0); // 終了メッセージ return 0; default: // デフォルト処理 return DefWindowProc(hWnd, msg, wParam, lParam); } } --------------------------------------------------------------------------------------------------
Re:Windowsが速攻で終わってしまう
メッセージループと呼ばれる、ループ処理を書かないと、ウィンドウを生成しても、そのままWinMain関数が終了してしまうので、プログラムも終了してしまいます。
メッセージループとは、次のようなループのことです。
(ちなみにこの値はプロシージャが呼んだPostQuitMessage関数の引数値です。)
参考URL:MSDN ライブラリ
http://msdn.microsoft.com/ja-jp/library/cc364699.aspx GetMessage関数
http://msdn.microsoft.com/ja-jp/library/cc410954.aspxitMessage関数
メッセージループとは、次のようなループのことです。
int MessageLoop() { MSG msg; int ret; while(1){ ret=GetMessage(&msg,0,0,0); if(ret==0||ret==-1)break; DispatchMessage(&msg); } return msg.wParam; }また、WinMainの戻り値は、WM_QUITメッセージのwParamの値、つまり、GetMessageが0を返したときのMSG構造体のwParamメンバの値を返すのがよいとされています。
(ちなみにこの値はプロシージャが呼んだPostQuitMessage関数の引数値です。)
参考URL:MSDN ライブラリ
http://msdn.microsoft.com/ja-jp/library/cc364699.aspx GetMessage関数
http://msdn.microsoft.com/ja-jp/library/cc410954.aspxitMessage関数