質問
mdicontainerであり、上部にメニューストリップがあるフォームがあります。子フォームをmdiコンテナーに追加し、子を最大化すると、メニューストリップで最大化されます。メニューストリップの下で最大化するように子を制限する方法を知りたい。助けていただければ幸いです。
解決
MDIで子フォームが最大化されるはずの方法で、子フォームが最大化されています。親フォームのメニューストリップを実際にはカバーしていません。実際には、独自のメニューストリップを親フォームのメニューストリップとマージしています。
子フォームがMDI親の使用可能な子領域のみを占有するように(およびそのメニューを親のメニューとマージしないように)、子フォームのResizeイベントに次のコードのようなものを入れます:
if (this.WindowState == FormWindowState.Maximized)
{
this.WindowState = FormWindowState.Normal;
this.Size = this.MdiParent.ClientSize;
this.Location = new Point(0, 0);
}
子ウィンドウが実際に最大化されるのを防ぎます。
「このコードのようなもの」と言いますこのスニペットが正確に機能しないためです。親フォームの ClientSize
プロパティは、フォームの全体的なサイズを提供しますが、MDIクライアント領域のみのサイズを使用する必要があります。どうやってそれを手に入れればいいのかわかりません。この質問をご覧ください:
他のヒント
MaximumSizeプロパティを設定して、コンテナ全体を埋めないようにすることができます。
これは古い質問ですが、私が取り組んでいる古いプロジェクトでこれに遭遇しただけなので、これを見た人への答えがあります。 DockをDockStyle.Fillに設定すると、目的の動作が得られます。
そのDockStyleが設定されている間にウィンドウの位置を変更したり、サイズを変更しようとすると、ウィンドウが奇妙に動作/見えるようになることに注意してください。
これを実現するために、MDIクライアントウィンドウのサイズ変更イベントにサブスクライブし、ウィンドウが最大化されたばかりの場合、DockStyleをFillに設定し、FormBorderStlyeをFixedDialogに設定して(サイズ変更を防止する)、ウィンドウの状態を通常に設定します最大化が行われないようにします。
この「最大化された状態」にある間、ユーザーがウィンドウを移動できないようにするため。 WndProcメソッドをオーバーライドし、ウィンドウが移動されたときに処理し(SC_MOVE)、アクションが有効にならないようにリターンを配置しました。