DOBON.NET DOBON.NETプログラミング掲示板過去ログ

新しいMDI子フォームをアクティブにせずに開きたい

環境/言語:[WindowsXP C#]
分類:[.NET]

はじめまして。
春紫苑と申します。

現在、VisualStduio2005 StandardEdition
でC#プログラミングの勉強を行っています。

簡単なMDIアプリを作成しているのですが、新しい子フォーム
をアクティブにせずに開く方法が実現できず困っています。

Zオーダーを操作してもダメ、アクティブになるのをキャンセルできる
ようなメソッドもイベントも見つけることができませんでした。

どうかお力を貸していただけないでしょうか?
> 簡単なMDIアプリを作成しているのですが、新しい子フォーム
> をアクティブにせずに開く方法が実現できず困っています。

子フォームが一枚もない時でもアクティブにしないということですね?それはちょっと無理なのではないでしょうか。

なぜアクティブになると困るのでしょうか?もしタイトルバーの色が変わるのが困るということでしたら、例えば、タイトルバーを隠して、自分でタイトルバーらしきものを表示するという方法が考えられます。
2006/12/01(Fri) 11:03:43 編集(投稿者)

2枚目の子フォームを開いた時にアクティブにしたくないのであれば、2枚目の子フォームをShowした後に、1枚目の子フォームをActivate()すればいいのですが、そういうことではないのかな?
> 2枚目の子フォームを開いた時にアクティブにしたくないのであれば、2枚目の子フォームをShowした後に、1枚目の子フォームをActivate()すればいいのですが、そういうことではないのかな?

説明足らずですみません。
すでにアクティブなMDI子フォームがある状態で、新しいMDI子フォームを
アクティブにすることなく開きたいのです。

2枚目の子フォームをShowした後に1枚目の子フォームをActivate()する方法
では、一瞬ですが、2枚目の子フォームがアクティブになってしまいます。

具体例を挙げるなら、タブブラウザみたいな動きを実現したいのです。
「新しいウィンドウをアクティブにしない」みたいな設定をONにすると、
アクティブなMDI子ウィンドウの後ろに追加されていくあの動作を。

フォームがアクティブになろうとするのをキャンセルする方法があれば
良いのですが…。

長々とすみません。
> フォームがアクティブになろうとするのをキャンセルする方法があれば
> 良いのですが…。

WndProcをオーバーライドして、WM_NCACTIVATEの時は無視する(つぶす)という方法があります。しかし、ちょっと試してみたところ、一瞬、前面にフォームが表示されます。

また、Win32 APIのShowWindowをSW_SHOWNOACTIVATEで呼び出す方法も考えられますが、うまく行くかわかりません。
返信が送れてすみません。

> WndProcをオーバーライドして、WM_NCACTIVATEの時は無視する(つぶす)という方法があります。しかし、ちょっと試してみたところ、一瞬、前面にフォームが表示されます。
>
> また、Win32 APIのShowWindowをSW_SHOWNOACTIVATEで呼び出す方法も考えられますが、うまく行くかわかりません。

言われた方法を試してみましたが、上手くいきませんでした。SetWindowPosでZオーダーを指定しつつ表示しても、やはり2個目のFormがアクティブになるのを防ぐことは出来ませんでした。
しかも、Win32APIを使って表示した場合、Loadなどのイベントが発生しませんでした。

また、FormクラスのShowWithoutActivationプロパティをオーバーライドしてtrueを返すようにすれば、新しいFormがアクティブになるのを防げるという記事を@ITで見つけたのですが、MDIではやはり新しいFormがアクティブになります。

CodeProjectなどでMDIを扱ったサンプルを探したりしましたが、欲しい情報は入手できませんでした。
この問題さえ解決できれば、現在関わっている作業が終わるのですが。。。

DOBON.NET | プログラミング道 | プログラミング掲示板