Winforms MDI アプリの Winform 上の C# コントロールから、または COM を介して PowerBuilder MDI アプリで使用される同じ C# コントロールから呼び出すことができる C# フォーム/コントロールをいくつか取得しました。
WinAPI 呼び出し SetParent を使用して、フォームを MDI に添付しています。
- 両方の環境で動作します (または動作するように見えます)。
- すでに開いている子ウィンドウの WindowState を引き継ぐ代わりに、子ウィンドウに独自の WindowState (Normal、Maximized) を持たせることができます (これは本当に苦痛でした)。
コントロールが T と呼ばれているとします。コントロール T のコードはフォーム D を呼び出します。
コントロール T はフォーム X にあります。
コントロール T もフォーム Y にあります。
.Net ではすべて問題なく、フォーム D は MDI 内にとどまります。
in PB:
コントロール T は PB コントロール PX にあります。コントロール T は PB コントロール PY にもあります。
PX の場合はすべて問題ありません。
ただし、PY には問題があります。フォーム D は MDI の子にならないようです。アプリの外に出て、タスクバー アイコンが表示される可能性があります。これは、機能するオブジェクトと同じオブジェクトを使用していることを強調します。SetParent は文字通り同じコード行です。
さらなる調査により、SetParent は実際には適切な MDI チャイルド化には機能しないことが明らかになりましたが、メニューなどをマージする必要がないので問題ありません。
興味深いことに、SetParent は機能しているように見えますが、GetParent を試してもハンドルが返されないことがわかりました...
Form form = new MyForm();
WindowsMessageHelper.SetParent(form.Handle, MDIParentHandle); //passed down
int parentHandle = WindowsMessageHelper.GetParent(form.Handle);
parentHandle は常に 0 になります....
あらゆる状況下でフォーム D を動作させる方法はありますか? 私自身の研究は有望ではありませんでした。フォームに戻ってコントロールとして書き直して、PowerBuilder に管理させたくありません。主な理由は、各フォームに複数のインスタンスが存在する可能性があり、PowerBuilder がそれを処理する必要があるためです (私が持っているコントローラー クラス/ベース クラスの代わりに)。 .netアプリでそれをやった).
.Net 内には問題がないことを強調してもよろしいですか。問題は PowerBuilder アプリにのみ表示されます。