ウインドウを表示したいのですが
実行した瞬間に終わってしまいます。
何が間違えているのか教えて頂けないでしょうか?
Windowsが速攻で終わってしまう
-
Justy
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さんのご指摘どおりです。
後者なら別の理由が考えられます。
-
conio
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);
}
}
---------------------------------------------------------------------------------------------------
tk-xleader
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関数