VC.NETでウィンドウプログラムを作成しています。
ウィンドウプロシージャで入力キーや、マウス、メニューの検出を行っているのですが、
<メニュー>→<オプション>でダイアログを開こうとするとメインウィンドウがフリーズします。
<メニュー>→<閉じる>をすると終了確認のメッセージボックスを表示するっていう至極単純なプログラムさえフリーズしてしまいます。
/************************************************************/
/* メインウィンドウプロシージャ */
/************************************************************/
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp, LPARAM lp)
{
switch(msg)
{
case WM_CREATE:
AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0); /* MFCを有効にするための処理 */
g_MainWnd = hWnd; /* グローバルなハンドル */
break;
case WM_DESTROY: PostQuitMessage(0); break;
case WM_COMMAND: OnMenu(hWnd,wp); break; /* 〃 メニュー選択 */
default:
return (DefWindowProc(hWnd, msg, wp, lp)); /* 無い命令はここで処理をする */
}
return 0;
}
/************************************************************/
/* メニュー処理関数 */
/************************************************************/
void OnMenu(HWND hWnd, WPARAM wp)
{
switch(LOWORD(wp))
{
case IDM_SEL_FILE: /* ファイル選択ダイアログ *********************/
DialogBox(g_hInst,"AUTOPLAY", g_MainWnd, (DLGPROC)SelFileDlgProc); //←ここでフリーズします
break;
case IDM_CLOSE: /* 終了 *********************/
id = MessageBox(hWnd, //ここでもフリーズします
"終了してもよろしいですか?",
"確認",
MB_YESNO | MB_ICONQUESTION);
if(id == IDYES){ /* OK? */
DestroyWindow(g_MainWnd); /* 終了 */
}
break;
}
}
モーダルで開こうとすると WM_CANCELMODE というメッセージが送られる事までは分かりました。
初心者と言って差し支えない程度の私なので、
もしかしたら単純な箇所でありえない間違いを犯しているかもしれませんが、
どうか暖かい目でご指導よろしくお願いします。
> 初心者と言って差し支えない程度の私なので、
だったら非 MFC プロジェクトで MFC を使おうとしない方がいいと思う。
ありがとうございます。
>だったら非 MFC プロジェクトで MFC を使おうとしない方がいいと思う。
たしかに(^^;
まぁ実際のプログラムではMFCは使用してないので
AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0); /* MFCを有効にするための処理 */
は無いものとしてお願いします(^^;
むー。
モーダルダイアログがメインウィンドウの裏に回ってるとか。何故だかは知らんけど。
SelFileDlgProc に WM_INITDIALOG は来ますか?
来てるならフリーズではない可能性があるかと。
ツイート | ![]() |