Windowsが速攻で終わってしまう

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
nisi

Windowsが速攻で終わってしまう

#1

投稿記事 by nisi » 16年前

ウインドウを表示したいのですが
実行した瞬間に終わってしまいます。
何が間違えているのか教えて頂けないでしょうか?

Justy

Re:Windowsが速攻で終わってしまう

#2

投稿記事 by Justy » 16年前

 メッセージループがないからです。

 ウインドウを折角つくっても、そのまま「とりあえず0を返して」アプリを
終了させてしまっていますよ。


3章 Windowsアプリケーションの骨格(その1)
ttp://web.kyoto-inet.or.jp/people/ysskondo/chap3.html

たかぎ

Re:Windowsが速攻で終わってしまう

#3

投稿記事 by たかぎ » 16年前

実行したプログラムがすぐに終わるのですか?
それとも、Windows(オペレーティングシステム)がすぐに終了してしまうのですか?

前者ならJustyさんのご指摘どおりです。
後者なら別の理由が考えられます。

conio

Re:Windowsが速攻で終わってしまう

#4

投稿記事 by conio » 16年前

原因は、すぐ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);

    }

}
--------------------------------------------------------------------------------------------------

tk-xleader

Re:Windowsが速攻で終わってしまう

#5

投稿記事 by tk-xleader » 16年前

メッセージループと呼ばれる、ループ処理を書かないと、ウィンドウを生成しても、そのままWinMain関数が終了してしまうので、プログラムも終了してしまいます。
メッセージループとは、次のようなループのことです。
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関数

閉鎖

“C言語何でも質問掲示板” へ戻る