2011-01-21 3 views
4

私は、メインウィンドウとメニューオプションから開いたいくつかのmdi子で構成されるレガシーアプリをCで書いています。新しいmdiの子をC#で記述できるようにするために、Cコードで呼び出され、C#コードを呼び出すC++ COM相互運用レイヤーを作成しました。次に、SetParent APIを使用して、Cメインウィンドウを、C#ウィンドウの新しい親が開かれた状態に設定します。これは動作するようです - C#のウィンドウは、メインウィンドウのMDIの子のように動作します。しかし、子ウインドウは正しくペイントされず、他のウインドウを移動させたり、メインウインドウの端に移動したりすると悪化します。他のウインドウの一部でペイントされるか、 。さらに、画面は非常にうまく反応しません。たとえば、あるテキストボックスから別のテキストボックスにタブすることはできません。SetParent APIで作成されたMDI子の再ペイントの問題

私のソリューションのアーキテクチャーには疑問の余地はありませんが(私にはこれが唯一の方法だと思いますが)、SetParentによって作成された子供でこのような問題を見たことがあるなら、それを修正することができました。

+0

+1は明らかに言葉の問題です。しかし、「これは唯一の方法です」はしばしば真実ではありません。 ;)へようこそSO – dss539

+0

フェアポイント!私はすでにこの問題に焦点を当てようとしていただけで、私はすでに試みていて、いくつかの「他の方法」を排除していました。 – AlfieAmalfi

答えて

0

はこれらの事を試してみてください。

  1. は物事が悪い行くときに正常に実行されている処理ループ内のApplication.DoEventsを追加します。

  2. メインフォームのペイントイベント内からMDIフォームをリフレッシュしてみてください。

+0

1 - 喜びはありません、私は恐れています。 2 - オプションではありません。メインフォームコードは4GL(私が知っていることはわかっています)によって生成され、これはコード内で可能なことを制限します。しかし、私はその応答に感謝します。 – AlfieAmalfi

0

SetParent()がどのように動作するのか完全に理解できません。それは言われて、ここで考慮すべきいくつかのより多くの事だ:「ヌルと非ヌルの親の間で変更するときSetWindowPos(SWP_FRAMECHANGED)を呼び出す必要があります:

the SetParent documentationのMSDNコミュニティコンテンツで

、マイクロソフトからChango V.はあなたと付け加えました。 "


また、実際に.NETフォームのメッセージループを実行していますか? Application.Run(yourManagedForm)に電話しましたか、またはCコードで独自のメッセージループを実行していますか?独自のメッセージループを実行している場合は、メッセージをPreProcessMessageにフィルタリングした後、管理対象フォームのWndProcメソッドに転送する必要があります。保護されているため、インターフェイスを公開する必要があります。私はどのように有効なのか分からない。

+0

SWP_FRAMECHANGEDは有望に見えましたが、残念ながら私の問題は解決していません。うーん、メッセージループ - 同僚はこれが問題の中心にあるかもしれないと示唆した。私はこれに取り掛かりたいとは思っていません...とにかく感謝します。 – AlfieAmalfi