重新绘制由SetParent API创建的MDI子项的问题

时间:2011-01-21 16:38:51

标签: c# c winforms com-interop setparent

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

请不要质疑我的解决方案的架构(相信我,这是唯一的方法),但是如果你曾经见过这样一个由SetParent创建的孩子的问题,我很乐意听到你是否管理过解决它。

2 个答案:

答案 0 :(得分:0)

试试这些:

  1. 在处理循环中添加Application.DoEvents,该循环通常在出现问题时运行。

  2. 尝试从主表单的绘制事件中刷新MDI表单。

答案 1 :(得分:0)

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


the SetParent documentation的MSDN社区内容中,Microsoft的Chango V.补充说:“在null和非null父级之间进行更改时需要调用SetWindowPos(SWP_FRAMECHANGED)。”


另外,您确定要实际运行.NET Form消息循环吗?您是否致电Application.Run(yourManagedForm),或者您是否在C代码中运行自己的消息循环?如果您正在运行自己的消息循环,则可能需要在通过WndProc对其进行过滤后,将消息转发到托管表单上的PreProcessMessage方法。您需要在受保护的情况下向这些接口公开接口。不过,我不知道这是多么有效。