初めてご質問させて頂きます。SAと申します。
【開発環境】
Windows2000,eMbedded VisualC++ 4.0 SP2
SDKにて開発を行っています。
【システム概要】
今回はMainとなるDummyWindowを作成し、それをコントローラーとして
DialogBoxを遷移していくアプリケーションを作成しようと考えています。
【ソース】
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return TRUE;
case WM_CREATE:
return TRUE;
case WM_PAINT:
return FALSE;
case WM_COMMAND:
if(g_Dsp_Ctl == 1){
Password_Main(g_hInst, (HWND)NULL);
}
if(g_Dsp_Ctl == 2){
SelectProc_Main(g_hInst, (HWND)NULL);
}
if(g_Dsp_Ctl != 0){
SendMessage(g_hwnd, WM_COMMAND, 0, 1);
}
return FALSE;
case WM_CTLCOLORSTATIC:
return FALSE;
default :
// デフォルトウィンドウ処理
return DefWindowProc(hwnd, msg, wp, lp);
}
}
int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR
lpCmdLine,int nCmdShow)
{
MSG msg;
HACCEL hAccelTable;
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE
(IDI_TEST));
wc.hCursor = 0;
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = _T(TEST);
if(!RegisterClass(&wc)) return 0;
g_hInst = hInstance;
HWND hwnd = CreateWindow(_T(TEST), _T(TEST),WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
g_hwnd = hwnd;
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_TEST);
//初期画面呼出し
g_Dsp_Ctl = 1;
SendMessage(g_hwnd, WM_COMMAND, 0, 1);
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
//if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
if(IsDialogMessage(hwnd,&msg))
continue;
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
【質問】
WndProc()内の WM_COMMAND で実際の画面遷移コントロールを行っています。
Password_Main()、SelectProc_Main() はDialogBoxを表示し、次の画面のg_Dsp_Ctlを
セットしてからEndDialog()を行っています。
流れは、
①WM_COMMAND 1回目
②Password_Main()
③PasswordのDialogが破棄され、制御がWndProc()に戻る。SendMessage()される。
④WM_COMMAND 2回目
⑤SelectProc_Main()
となります。
問題はDialogBox関数を実行した時、EndDialogされるまで制御が戻らないはずですが、
SelectProc_Main()内のDialogBox関数実行時は制御がストップしません。
ご存知の方いらっしゃいましたらご教授お願いします。
そのPasswordのDialogとやらは、モーダルダイアログですか?
モードレスになっていませんか?
RAPT様
>そのPasswordのDialogとやらは、モーダルダイアログですか?
モーダルダイアログです。具体的には、Password_Main()関数内でDialogBox()関数を呼び出し
ています。
また、Password_Main()とSelectProc_Main()で違いがあるのかと思い、関数を逆にして実行
しても同様の結果となりました。流れは以下の通りです。
①WM_COMMAND 1回目
②SelectProc_Main()
③SelectProcのDialogが破棄され、制御がWndProc()に戻る。SendMessage()される。
④WM_COMMAND 2回目
⑤Password_Main() で、DialogBox関数実行時は制御がストップしない
でした。
よろしくお願い致します。
ふと思ったんですが、
この行、
SendMessage(g_hwnd, WM_COMMAND, 0, 1);
ほんとにSendMessageで良いんですかね。
PostMessage(g_hwnd, WM_COMMAND, 0, 1);
とするべきじゃないかと言う気がしますけれど。
自己解決致しました。
Dialog画面のWM_DESTROYメッセージ処理時に、PostQuitMessage(0)を発行していました。
これを外すと二回目も正常にストップするようになりました。
この件に関して少しでも考えてくださった皆様、本当にありがとうございました。