メインのウインドウ上に貼り付けたボタンをクリックすると
そこから、(このメインウインドウを親とする)モーダルダイアログを開き、
そのモーダルダイアログ上のボタンをクリックすると
(このモーダルダイアログを親とする)メッセージボックスが表示されるという
プログラムを書いたのですが、ウインドウの親子関係でうまく分からないこと
があります。
メインのウインドウ
↓
モーダルダイアログ
↓
メッセージボックス
メインウインドウからモーダルダイアログを出した段階で
やっぱりやめた、と、そのモーダルダイアログの閉じるボタンを
押して消した場合、ダイアログの親であるメインウインドウが再び
アクティブになります。ここまでいいのですが、
一旦、モーダルダイアログから更にメッセージボックスを
表示させると、その後(メッセージボックスに応答してそれを消してから)、
モーダルダイアログを閉じた時、
メインウインドウは自動的にアクティブになりません。
メインのウインドウ
×
↑
モーダルダイアログ
↑
メッセージボックス
モーダルダイアログを閉じるとき、初めはそのダイアログのクローズ・イベントである
Dialog1_QueryClose()のなかで「EndDialog(hDialog1)」と書いていたのですか
これを書くと、モーダルダイアログが消えてからメインのウインドウまで
たて続けに消えてしまい、プログラム自体が終了してしまいます。
それでEndDialogは書かずにおいてみたのですが、今度は
上に書いたように、メインウインドウがアクティブにならなくなる。
この辺の親子のつながりがよく分からず、悩んでいます。
メインのウインドウ
↑
モーダルダイアログ
↑
メッセージボックス
このように、それぞれを閉じた時、元を辿って親を順にアクティブにするには
どうすれば良いのでしょうか?
---------------------------------------------
下にプログラムを。
AB4.24で実行しました。
まずRADでメインのウインドウとダイアログ1(モーダルダイアログ)を
作り、
メインウインドウに[Dialog1]、[Close]という二つのボタンを
貼り付ける。
([Dialog1]をクリックでダイアログ1を開く。[Close]でメインウインドウを
閉じる。)
それからDialog1というモーダル・ダイアログを作り、
[OK]、[CANCEL]という二つのボタンを貼り付ける。
([OK]でメッセージボックスを表示し、[CANCEL]でダイアログを閉じる。)
(ここにソースが表示されます) [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
コード: 全て選択
'---------- メイン・ウインドウ -----------
'
' ●MainWnd クリエイト
'
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
'↓このメイン・ウインドウのボタンは何故かフォーカスを
' 当てて、「標準のボタン」にチェックを入れてもEnterで押せない。何故なんだろうか?
SetFocus(GetDlgItem(hMainWnd,CommandButton1))
End Sub
'
' ●MainWnd [Dialog1]ボタン・クリック
'
Sub MainWnd_CommandButton1_Click()
DialogBox(hMainWnd,"Dialog1")
End Sub
'
' ●MainWnd [Close]ボタン・クリック
'
Sub MainWnd_CommandButton2_Click()
SendMessage(hMainWnd,WM_CLOSE,0,0)
End Sub
'----------- ダイアログ1 (モーダル・ダイアログ) -------------
'
' ●Dialog1 クリエイト
'
Sub Dialog1_Create(ByRef CreateStruct As CREATESTRUCT)
SetFocus(GetDlgItem(hDialog1,CommandButton1))
End Sub
'
' ●Dialog1 OKボタン・クリック
'
Sub Dialog1_CommandButton1_Click()
MessageBox(hDialog1,"OKが押されました","Message",MB_OK)
End Sub
'
' ●Dialog1 CANCELボタン・クリック
'
Sub Dialog1_CommandButton2_Click()
SendMessage(hDialog1,WM_CLOSE,0,0)
End Sub
'
' ●Dialog1 閉じる
'
Sub Dialog1_QueryClose(ByRef cancel As Integer)
' ↓ここにEndDialogを書くと、メインのウインドウまで消えてしまい
' プログラムが終了してしまうのでとりあえずREM文にしておく。
' EndDialog(hDialog1,0)
End Sub