- 締切済み
[VB6]オーナーウィンドウを設定したShowメソッド
こんにちは。 XP(SP2),VB6(SP6)で 親フォーム -> 子ダイアログ -> 孫ダイアログを表示する処理を作成し実行すると、 子ダイアログを閉じた際、親フォームが他のアプリケーションの下 にもぐってしまいます。 (例えばメモ帳上で実行して、子ダイアログを閉じた時にメモ帳の下に隠れてしまう、デバッグ時ならばVBの下に隠れる) 孫ダイアログを表示させずに、子を閉じるとこの様に減少は起こりません。 なぜこの様になるのでしょうか? 又、回避策はあるでしょうか?ご存じの方、教えてください。 以下、現象再現用のテストプログラムです。 親フォーム Private Sub Command1_Click() dlg1.Show vbModeless, Me End Sub 子ダイアログ(dlg1) Private Sub Command1_Click() dlg2.Show vbModal, Me End Sub Private Sub CancelButton_Click() Unload Me End Sub 孫ダイアログ(dlg2) Private Sub CancelButton_Click() Unload Me End Sub
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- redfox63
- ベストアンサー率71% (1325/1856)
親子関係ではなく モードレスかモーダルかの違いだと思いますよ モーダルの場合(子から孫)は孫を閉じない限り子は操作ができません モードレスの場合(親から子)は子を閉じなくても親の操作が可能です モードレスの場合はプログラムの組み方によっては複数の子の生成も可能です 親 > 子 > 孫 が常に1つしか存在しないのなら 親で子を生成する際のコードを モードレスにしてみてはいかがでしょう '親フォーム Private Sub Command1_Click() dlg1.Show vbModal, Me End Sub といった具合で … どーしてもモードレスにしなければいけないのであれば WinAPIの AttachThreadInputとSetForgroundWindowなど組み合わせて 前面への移行処理が必要になると思います # AttachThreadInputには ThreadIdが必要になるので # 現在の最前面のウィンドウハンドルなどから取得する必要が出てきます # AttachThreadInput 最前面 などキーワードに検索してみましょう
お礼
今回の動作については子ダイアログUnload時に 親Windowにフォーカスを当てることで回避できました。 何故、下にもぐるのかはわからずじまいでしたが・・・ AttachThreadInputは知らなかったため、 参考になりました、ありがとうございます。
補足
子ダイアログは複数表示が必要のためモードレスとし、 newを使用して表示しています。