4

メインウィンドウとメニューオプションから開かれたいくつかのmdi子で構成されるCで書かれたレガシーアプリがあります。新しい mdi の子を C# で記述できるようにするために、C コードによって呼び出され、次に C# コードを呼び出す C++ COM 相互運用レイヤーを作成しました。次に、SetParent API を使用して、開いている C# ウィンドウの新しい親として C メイン ウィンドウを設定します。これは機能しているようです - C# ウィンドウはメイン ウィンドウの MDI 子のように動作します。しかし、子ウィンドウは適切に描画されず、他のウィンドウをその上に移動したり、メイン ウィンドウの端に移動したりすると悪化するだけです。他のウィンドウの一部で描画されるか、移動するとそれ自体の一部が残ります。 . さらに、画面がうまく反応しません。たとえば、あるテキスト ボックスから別のテキスト ボックスに移動できません。

私のソリューションのアーキテクチャについて質問しないでください (信じてください。これが唯一の方法です)。ただし、SetParent によって作成された子でこのような問題が発生したことがある場合は、修正できたかどうかをぜひお聞かせください。 .

4

2 に答える 2

0

SetParent() の仕組みがよくわかりません。そうは言っても、考慮すべきことがいくつかあります。


SetParent ドキュメントの MSDN コミュニティ コンテンツで、 Microsoft の Chango V. は次のように付け加えましたSetWindowPos(SWP_FRAMECHANGED)


また、実際に .NET Form メッセージ ループを実行していますか? を呼び出しましたかApplication.Run(yourManagedForm)、それとも C コードで独自のメッセージ ループを実行していますか? 独自のメッセージ ループを実行している場合は、メッセージをWndProcでフィルタリングした後、マネージ フォームのメソッドにメッセージを転送する必要がある場合がありますPreProcessMessage。これらは保護されているため、これらへのインターフェイスを公開する必要があります。ただし、これがどの程度有効かはわかりません。

于 2011-01-28T20:59:33.523 に答える
0

次のことを試してください。

  1. 問題が発生したときに通常実行される処理ループ内に Application.DoEvents を追加します。

  2. メイン フォームのペイント イベント内から MDI フォームを更新してみてください。

于 2011-01-28T20:30:27.507 に答える