ダイアログボックスのアクティブ動作について

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: ダイアログボックスのアクティブ動作について

音。

by jacoby » 2006年10月09日(月) 23:10

 (↑のフォーカスを投げるプログラムではなく、一番最初の何も小細工してない
ものを使った時ですが)
 モードレス、モーダル(※メッセージボックス)が表示されている時の
一旦全体非アクティブからメインウインドウをクリックしたとき、
例の「ポーン」という音(モーダルに返答しなさいよという感じでしょうか?)は
聞こえるんです。
 だから、メインウインドウの領域も確かに認識していることは確かだと
思うのですが。

用語の間違いを。

by jacoby » 2006年10月09日(月) 21:55

 上の記述、自分の用語の使い方に間違いがあるので修正します。

 これまで親ウインドウ、子ウインドウと書いていましたが
僕のこのプログラムの場合では正しくはそれぞれ、

 「オーナーウインドウ」
 「オーナー付きウインドウ」

の誤りでした。

 子ウインドウというのは親ウインドウのクライアント領域内にのみ
表示されるウインドウということで、これはプログラムの内容と違いますね。
 以後気をつけて、そう書きたいと思います。
 失礼しました。

レスありがとうございます。

by jacoby » 2006年10月09日(月) 17:44

Mario2さん、レスありがとうございます。
CreateDialogの第1引数にGetDesktopWindow()を指定してはどうでしょう?
 こちらでもこの設定で実行してみましたが、どうも状態は変わらないようです。
(こちらのやり方が間違っているかもしれません。いずれにしてもレスを寄せて
頂いて、感謝です。)

 それで、以後もあれこれ考えてはみるのですが、

 まずメッセージボックスをモーダルダイアログに変えてハンドルを取得出来る
ようにして、
 メインウインドウ、及びモードレスウインドウのアクティベイト・イベントで
"もしモーダルダイアログ(※前述のメッセージボックスの代わり)が存在するなら
それにフォーカスを移す"という内容のプログラムを書いてみました。
 ただしこの方法でも、モードレスが表示された後での状態は相変わらず
なので、(モードレス、モーダル共に表示されていて、一旦アプリ全体が
非アクティブになってからのメインウインドウへのクリックには反応無し)
試しにモーダルとメインウインドウの親子関係を解消させて実行してみます。

 するとメイン、モードレスへのクリックでフォーカスをモーダルに移せることは
移せるのですが、一度はそれぞれのウインドウがアクティブになってから
移るような感じなので一瞬パパッとちらつく感じがあり、更にそれぞれフォーカスを
投げた側が非アクティブなウインドウとしての表示にならないまま(タイトルバーが
青いまま)なので、まるで「アクティブウインドウが二つ存在している」様でかなり
不気味です。

 結局、この方法はうまく行かないのではと思いつつ、引き続き考えています。

 タスクバーに表示されているメインウインドウへのクリックでは、
モードレスウインドウがあろうが無かろうが
うまくモーダル(※メッセージボックス)がアクティブになってくれるのですが。。。。

by Mario2 » 2006年10月08日(日) 09:40

jacobyさんの希望するものかどうかわかりませんが、CreateDialogの第1引数にGetDesktopWindow()を指定してはどうでしょう?

GetDesktopWindow()はデスクトップのウィンドウハンドルを返すものなんですが・・・

上手くいかなかったらすいません。

レスありがとうございます。

by jacoby » 2006年10月07日(土) 22:43

 イグトランスさん、レスありがとうございます。
とりあえずCreateDialogの最初の引数にhMainWndを指定しては
どうでしょうか。
 教えて頂いた通り、CreateDialogの最初の引数にhMainWndを
指定すると一度非アクティブにしてから、MainWndをクリックすると
メッセージボックスをアクティブにすることが出来ました。
 ただしCreateDialogで親をhMainWndにしたくない場合など
(このモードレスウインドウをMainWndの子にしてしまうと常にMainWndより
前面に来てしまう。それを避けたい時など)には、ここは「0」にしておきたい
と思います。
 
 CreateDialogの最初の引数を「0」のままで、というのが
実現できればいいのですが、良い方法はあるでしょうか?

 (もともとこの小さなメッセージボックスはメインウインドウと一つのモードレス
ウインドウ(常に画面上に表示されている)からなるアプリケーションプログラムの
「エラーメッセージ」表示のために作ろうとしました。
出来れば、メッセージボックスが開いた状態で一度アプリケーション全体が
非アクティブなった後では、メインウインドウをクリックしても、あるいはモードレスウインドウをクリックしても(つまりアプリに属する全てのウインドウをクリックしても)、
このメッセージウインドウをアクティブにするように出来たら
とは思っているのですが。これについてももし良い方法があれば
教えて下さい。)

by イグトランス » 2006年10月07日(土) 21:05

とりあえずCreateDialogの最初の引数にhMainWndを指定してはどうでしょうか。

ダイアログボックスのアクティブ動作について

by jacoby » 2006年10月07日(土) 01:35

 メインウインドウに二つのボタンを貼り付け、
一つをクリックすると「メッセージボックス(モーダル・ダイアログ)」、
もう一つをクリックすると「モードレス・ダイアログ」を開くような簡単な
プログラムを書きます。

コード: 全て選択


Sub MainWnd_CommandButton1_Click()
 MessageBox(hMainWnd,"Message","MessageBox",MB_OK)
End Sub

Sub MainWnd_CommandButton2_Click()
  hModelessDialog=CreateDialog(0,"ModelessDialog")
  ShowWindow(hModelessDialog,SW_SHOW)
End Sub
 ここで、メッセージボックスを表示させてから、
デスクトップの他の場所などをクリックして一度全体を非アクティブにして、
もう一度このメッセージボックスをアクティブにしたい時、
「親であるメインウインドウをクリックしても」親子関係にあるメッセージ
ボックスをアクティブにすることが出来ます。
 ただしこの同様の動作を、その前にモードレスダイアログを表示させてから
行おうとすると、うまく行きません。(メッセージボックスを再びアクティブにするには
その小さなメッセージボックスウインドウ自体をクリックしなければならなくなります。)
 
 モードレスダイアログが存在する場合でも、上に書いたような親子関係が生きた
アクティブ動作をさせるにはどうすれば良いでしょうか?

(AB4.24/WinMe)

ページトップ