4

我有一个用 C 编写的遗留应用程序,它由一个主窗口和几个从菜单选项打开的 mdi 子窗口组成。为了允许用 C# 编写新的 mdi 子级,我创建了一个 C++ COM 互操作层,该层由 C 代码调用,然后调用 C# 代码。然后,我使用 SetParent API 将 C 主窗口设置为打开的任何 C# 窗口的新父窗口。这似乎可行 - C# 窗口的行为类似于主窗口的 MDI 子窗口。但是,子窗口无法正确绘制,如果您将其他窗口移到它上面或将其移动到主窗口的边缘,它只会变得更糟 - 它会被其他窗口的一部分绘制或在移动时留下一些自身的碎片. 此外,屏幕的响应不是很好,例如,您无法从一个文本框切换到另一个文本框。

请不要质疑我的解决方案的架构(相信我,这是唯一的方法),但是如果您曾经遇到过由 SetParent 创建的孩子的此类问题,我很想听听您是否设法解决了它.

4

2 回答 2

0

Try these things:

  1. Add Application.DoEvents inside a processing loop that is normally running when things go bad.

  2. Try refreshing the MDI forms from within the main form's paint event.

于 2011-01-28T20:30:27.507 回答
0

我不完全理解 SetParent() 的工作原理;话虽如此,这里还有一些需要考虑的事情:


在SetParent 文档的 MSDN 社区内容中,来自 Microsoft 的 Chango V. 补充说:“SetWindowPos(SWP_FRAMECHANGED)在 null 和非 null 父级之间切换时需要调用。”


另外,您确定您实际上正在运行 .NET Form 消息循环吗?您是调用Application.Run(yourManagedForm)还是在 C 代码中运行自己的消息循环?如果您正在运行自己的消息循环,则可能需要在WndProc通过PreProcessMessage. 您需要向它们公开一个接口,因为它们受到保护。不过,我不知道这有多有效。

于 2011-01-28T20:59:33.523 回答