UserControl を介してインターフェイスを提供する別のアプリにアプリケーションを埋め込もうとしています。
通常の Windows.Form を含むユーザー コントロールを作成するのは簡単です。しかし、埋め込むフォームにプロパティ IsMdiContainer == true がある場合、これを行うにはどうすればよいでしょうか?
どうも
次のアプローチを使用できます。自動ではありませんが、機能します。
1) ユーザー コントロール内で、MDI ホストである Windows アプリケーションを宣言します。2) 新しいウィンドウを作成して処理する機能をユーザー コントロールのツールバーにマップするか、カスタム コントロールにマップすることができます。3) 新しいウィンドウを作成するたびに、MDI 親をステップ 1 で宣言したウィンドウに設定します。
主なアイデアはこの投稿にあります C# Panel As MDI Container
このアプローチには 1 つの問題があります。子ウィンドウを最大化すると、すべてのユーザー コントロール領域が最大化されてカバーされ、タイトル バーが表示されなくなります。MDI子ウィンドウの最大サイズをユーザーコントロールのサイズより少し小さく設定することで、このエラーを取り除くことができると思います
次の理由により、それが可能になるとは思いません。
マルチ ドキュメント インターフェイス (MDI) の親フォームは、トップレベル ウィンドウである必要があります。
親を MdiContainer に設定しようとすると、例外が発生します/発生するはずです。これを回避する唯一の方法は、埋め込もうとしているウィンドウを再設計することです。MDI の概念なしで行うか、本当に必要な場合は、MDI のように動作するが制限のないカスタム コントロールとして実装します。(これは、多くのカスタム ドローイングを必要とする可能性が最も高い注文です。)
実際には、実行時にSetParent関数を介して他のプロセスからウィンドウの親を変更できるハック アプローチがあります。たとえば、電卓ウィンドウ アプリを「盗んで」別の MDI 内でホストすることはできますが、特に複雑なアプリの場合、これは非常に不安定になる傾向があります。MDI アプリを別のプロセスとして起動し、ホストされたアプリから SetParent を呼び出す必要があります。上記のオプションのいずれもニーズに合わない場合は、試してみる価値がありますが、最も可能性の高い結果は実行時例外です。