DialogBoxの制御 – プログラミング – Home

通知
すべてクリア

[解決済] DialogBoxの制御


SA
 SA
(@SA)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

初めてご質問させて頂きます。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関数実行時は制御がストップしません。

ご存知の方いらっしゃいましたらご教授お願いします。


引用未解決
トピックタグ
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

そのPasswordのDialogとやらは、モーダルダイアログですか?
モードレスになっていませんか?


返信引用
SA
 SA
(@SA)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

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関数実行時は制御がストップしない
でした。

よろしくお願い致します。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

ふと思ったんですが、
この行、
SendMessage(g_hwnd, WM_COMMAND, 0, 1);

ほんとにSendMessageで良いんですかね。

PostMessage(g_hwnd, WM_COMMAND, 0, 1);

とするべきじゃないかと言う気がしますけれど。


返信引用
SA
 SA
(@SA)
ゲスト
結合: 22年前
投稿: 17
Topic starter  

自己解決致しました。

Dialog画面のWM_DESTROYメッセージ処理時に、PostQuitMessage(0)を発行していました。
これを外すと二回目も正常にストップするようになりました。

この件に関して少しでも考えてくださった皆様、本当にありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました