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

フォーム内フォームのActivate

分類:[.NET]

OS = 2K/XP/Vista/7
Language = VB/C#/DelphiPrism
.NET = 2.0

こんにちわ

どぼん様のTIPSで「フォーム内にフォームを表示する」
http://dobon.net/vb/dotnet/form/formwithinform.html
があり、現在実践中なのですがタイトルバー色などが非アクティブのものになります。

マウスで選択しても、内部フォームに対してActivateメソッドを実行しても
アクティブ色にはなりませんでした。

内部フォームのタイトルバー色などをアクティブ状態にするにはどうすればよいか、
何卒ご教示いただければと思います...
■No26500に返信(月夜見命さんの記事)
> 内部フォームのタイトルバー色などをアクティブ状態にするにはどうすればよいか、
Form 上ではなく、MdiClient 上に配置すればアクティブ色にできますよ。
(要するに、MDI 子フォームにするということ)
返信ありがとうございます

■No26507に返信(魔界の仮面弁士さんの記事)
> Form 上ではなく、MdiClient 上に配置すればアクティブ色にできますよ。
> (要するに、MDI 子フォームにするということ)

すみません、最初の要件を提示していませんでした...
Controlを継承した とある独自の拡張部品 を作っていて、
機能の1つとして、フォームの見た目&一部フォーム的な動作 をさせる部分があり
それをフォーム内フォームを応用して実現しようとしています。


MdiClientクラスの存在を初めて知ったので、以下のように色々試してみました。
※デザイナは一切使っていません

・まずMDIClientは継承できないらしいので、普通にControlを継承した
 カスタムコントロールにMDIClientをAdd
・フォームのMdiParentにMDIClientを入れようとしたが型が違うので無理
・ならばとMDIClientのControls.Addでフォームを入れようとしたが
 MDI子フォームじゃないとだめと言われる
・フォームのIsMdiChildを変えようとしたけどReadOnlyだった

ということでMdiClientクラスは挫折...
じゃぁTopLevel=Falseな枠無しFormを継承してコントロールっぽくすればいいのでは
と以下を試してみました
※デザイナは一切(ry

・Formを継承したカスタムコントロール、コンストラクタで
 TopLevel=FalseのIsMdiContainer=True
・例外「MDI コンテナ フォームはトップレベルにしてください」 ←いまここ

という状況です...

色々試してみますが、フォーム内フォームで
そのままアクティブな色にする方法があればそれが一番理想です。
■No26510に返信(月夜見命さんの記事)
> MdiClientクラスの存在を初めて知ったので、以下のように色々試してみました。
親フォームの IsMDIContainer プロパティを True にするだけで OK です。
そうすれば、自動的に MDIClient が親フォームに Controls.Add されます。


> ・まずMDIClientは継承できないらしいので、普通にControlを継承した
>  カスタムコントロールにMDIClientをAdd
> ・フォームのMdiParentにMDIClientを入れようとしたが型が違うので無理
MDIClient は、MDI子フォームを登録するための特殊なコントロールで、
 [親Form(TopLevel=True)]
 └[MDIClient]
  ├[子Form(TopLevel=False)]
  └[子Form(TopLevel=False)]
という階層構造を作り上げるための物です。

通常、MDIClient の存在を意識する必要は無いのですが、MDI フォームにすると
親フォームの背景色が異なってしまうため、その場合には MDIClient の
背景色を意図的に変更するために、MDIClient の操作が必要になるケースがあります。


> ・ならばとMDIClientのControls.Addでフォームを入れようとしたが
>  MDI子フォームじゃないとだめと言われる
> ・フォームのIsMdiChildを変えようとしたけどReadOnlyだった
MDI フォームの取り扱いは、こちらを参照してみてください。
http://dobon.net/vb/dotnet/form/mdiapplication.html


> 色々試してみますが、フォーム内フォームで
> そのままアクティブな色にする方法があればそれが一番理想です。
一つのアプリ内で、複数のフォームが同時にアクティブになることは無いので、
アクティブになれるのは親のみです。ただし MDI フォームの場合には、
子フォームもアクティブになることができます。

もし、MDI を使わないのであれば、タイトルバーを自分で描画するという手もあります。
この場合、そのエリアをタイトルバーと認識させるために、WM_NCHITTEST メッセージを
処理するようにしてみてください。
返信ありがとうございます

とにかく試行錯誤してみます
根本解決はしていないですが話はクローズして
何かあったら別に立てるので、チェック入れます

ありがとうございました
解決済み!

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