我正在为第三方MFC应用编写Win32插件DLL。 DLL需要显示模式对话框。当我使用DialogBox()
或其他普通的Win32 API(例如我试图编写自己的模态循环)时,主应用程序的窗口不会重绘所有元素:它重绘标准元素,但不重绘客户区。无模式对话框显示得很好。
我怀疑这是因为MFC在Win32意义上没有真正的模态对话框。它只能有一个消息循环,而DialogBox()
中的一个单独的循环会破坏其精密的机制。这是解释这一点的a CodeProject article。但是CodeProject的这篇文章已经有9年了,所以也许从那时起事情发生了变化。有人可以对此有所了解吗?该应用程序使用MFC 8(即mfc80.dll
)。
更新即可。这是original question的链接;它可能包含一些其他信息。
更新2 。感谢大家;我非常感谢所有的建议,它肯定有助于我全面了解事物如何融合在一起。我要探索的第一条路径是使用原生MFC“模态”对话框。 (因为我从Python做了所有这些,我将使用Python绑定MFC,pywin32
)。这需要一些时间;当它准备好后,我会用结果更新帖子。
答案 0 :(得分:4)
每个线程都可以有一个消息循环。将模态对话框放入单独的线程中,并通过禁用父窗口来模拟Windows的标准行为。
编辑:经过一番讨论(见下文),看来父代码行为不正确。
尽管如此,我认为还有可能的解决方法。一个可以是父窗口(对于模态对话框,但是当前行为不正确的子窗口)覆盖错误的窗口内容,但是从内存中的DC重绘它以模仿正确的行为。当然,父窗口仍然必须被禁用。另一种解决方案可能是子窗口的子类,以纠正行为。由于插件将在同一个进程中运行,因此实现应该很简单。