1

Winforms MDI アプリの Winform 上の C# コントロールから、または COM を介して PowerBuilder MDI アプリで使用される同じ C# コントロールから呼び出すことができる C# フォーム/コントロールをいくつか取得しました。

WinAPI 呼び出し SetParent を使用して、フォームを MDI に添付しています。

  1. 両方の環境で動作します (または動作するように見えます)。
  2. すでに開いている子ウィンドウの 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 アプリにのみ表示されます。

4

3 に答える 3

1

最終的に、違いは、PB がコントロール PX (フォーム D の呼び出しが機能するもの) に対して .MDIParent を設定するのと同等のことを行っていたが、PY に対してはそうではなかったということであることがわかりました。

それがソートされると、正しい MDIParent ハンドルが取得され、すべてが正常になりました。

于 2009-02-25T17:08:56.673 に答える
0

まだ解決していない唯一の問題が GetParent が機能しない場合は、それを受け入れることができるかもしれません。

編集:しかし、アスカーにはさらに問題があります。

これを機能させるには、それぞれ順番に実行する必要がある多くの API ポークがあります。これをユーザー コントロールにして、COM インターフェイス経由で使用する場合はネイティブ MDI の親に配置するか、.NET MDI の親に配置する場合は .NET MDI の子に配置する方が簡単です。

ここで使用する必要があるさまざまな基本ウィンドウ プロシージャ (DefWindowProc と DefMdiChildProc) があり、これを機能させるには、最終的に DefMdiChildProc を実装します。

.NET リフレクターを使用した場合は、System.Windows.Forms.Form に DefMdiChildProc を呼び出させる方法を見つけることができる場合があります。

于 2009-02-24T18:21:19.800 に答える
0

子は System.Windows.Forms.Form である必要があり、その MdiParent プロパティを MDI 特許ウィンドウ (親ではない) に設定する必要があります。

コンテナーは、いくつかの規則にも従う必要があります。

MSDN の MDI の説明を読むと、さらに役立つ場合があります。


オプション 2: 単一のコントロールではこれを実行できない場合があります。代わりに、コア実装を 2 つのラッパーで構成することを検討してください。最初のラッパーは WinForms MDI 子として機能し、2 つ目は PowerBuilder が動作する GUI フレームワークで使用する COM ラッパーとして機能します。

于 2009-02-24T18:05:58.667 に答える