- - PR -
MDI子フォームで自分自身をアクティブにしたい
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-06-20 15:56
VS2005でMDIのアプリ開発しています。
あるMDI子フォームがDeactivateイベントを拾ったときに、 その子フォームの状態応じて、自分自身を再度アクティブに したいのですがうまくいきません。 VB6では、 Me.SetFocus でうまくいっていたのですが、VB.NETでは Me.Focus() してもフォーカスが自分には戻ってきません。 どうすればいいでしょうか? 親フォームにアクティブにしてほしいといった依頼を掛ける ようなことをしないといけないのでしょうか? | ||||||||
|
投稿日時: 2007-06-20 16:04
まんまのActivateメソッド
| ||||||||
|
投稿日時: 2007-06-20 17:08
Activateメソッドでもだめです。
何かほかにありませんか? | ||||||||
|
投稿日時: 2007-06-20 17:28
MSDNのActivateメソッドから引用
というわけで、親フォームのMDIChildActivateイベントでごにょごにょしてみてください。 | ||||||||
|
投稿日時: 2007-06-20 20:31
親フォームのMDIChildActivateイベント内で子フォームがアクティブになったことを
イベントでキャッチし、直前にアクティブだったフォームが該当するフォームのとき に、そのフォームをActivateしてやればとりあえずいけるのですが、別の子フォームを マウスクリックしたとき、そのクリックしたフォームがもう一度Activeになってしまい 結果、該当する子フォームのDeactivateイベントが2回入ってきてしまいます。 何か妙案は無いでしょうか? ちなみにWindowリストから別のフォームを選択したときは1回しか入ってきません。 なんかTreeViewにしろFormにしろ、マウスクリックしたとき2回入ってきてしまう ような感じです。 | ||||||||
|
投稿日時: 2007-06-21 17:38
いろいろ試しましたが困難なようです。
まず要求を実現するには、 きっかけ(あるウィンドウがアクティブになる)から派生するイベント(ウィンドウメッセージ)の一連の流れが すべて終わってから処理をする必要があります。 今回の場合の困難な原因はイベントの対象(ウィンドウ)が一つではないことです。 おっしゃるようにイベントがイベントを呼び、最悪イベントの無限連鎖が発生します。 したがってポイントは事象がすべて終わったタイミングを知ることですが 標準のイベント(Framework)では無理ではないかと思います。 標準でできないならウィンドウメッセージで判断(WndProc)する方法を模索することになりますが 結局、「一連のメッセージ群が終わったタイミング」、 つまり「最後のメッセージは何か」を知る必要があります。 これについてはそういうものがあるか無いかを含めて調べなくてはなりません。 代替案としては、そのフォーカスを維持する条件があらかじめわかっているなら 他の子フォームを非表示にしておくというのが思いつきます。 #それがMDI子フォームの一部という性質のものなのかという根本の疑問はありますが。 あと半分冗談で書きますが、非同期タイマを仕掛けるという手もあります。 #一連のイベントが終わったと判断できる時間後にフォーカスを設定する。 ただし、「何秒後」が長ければ精度は上がりますが、UIレスポンスも遅くなり変な感じになります。 | ||||||||
|
投稿日時: 2007-06-21 18:59
丁寧なご対応ありがとうございます。あれから、GotFocusやLostFocusなどのイベントで処理できないか確認していたのですが、無理のようですね。あきらめました。 VB6ではMe.SetFocusで簡単に実現できていたのですが、むしろVB6のほうが特殊だったということなのでしょうね。 | ||||||||
|
投稿日時: 2007-06-21 22:18
pine さん、こんにちは
ダッチです。 「子フォームの状態に応じて」ということですので、その子フォームの Validating イベント でアクティブ状態を解除したくないのであれば、イベントをキャンセルしてしまうというのは、どうでしょうか。 |
1|2|3
次のページへ»