【发布时间】:2019-12-08 07:03:39
【问题描述】:
我正在调试一个显示格式化消息框的 3rd 方库的奇怪问题。该库使用基于 CDialog 的类并使用 DoModal() 方法运行消息框对话框。有时一条消息从一个使用主窗口句柄作为父窗口(类型 1)的公共子程序中显示,其他时候从另一个模式对话框(类型 2)显示。
有时类型 1 调用由模态对话框中的操作触发,当这种情况发生时,在消息对话框关闭后原始对话框不再是模态的。除了使用系统默认消息框的格式化消息框和原始对话框保持模态外,没有任何更改,如预期的那样。 当进行类型 2 调用时,原始对话框始终保持模式,因此我正在努力确保这是我调用库函数的方式,但这看起来可能是 CDialog 本身的错误,所以我想我会问如果有人知道这件事。
我以前从未使用过这些类库(我是一个老派的 C 人),但看起来库总是使用 EndDialog() 来终止模式消息框,并且没有“花哨的低级" 我能找到的 windows 东西(除了消息格式)。很明显,我真的不知道我在问什么,所以如果有更好的地方可以讨论这个问题,请发给我。
另一方面,如果从 CDialog 和 DoModal() 派生的任何东西这样做,这似乎是类库中的一个错误,因为内置模式对话框(如 MessageBox)没有这种不良影响。我会分享库代码,但我不是原作者,也没有权限,但我愿意找东西,只要你愿意对不熟悉C++代码结构的人有一些耐心。
【问题讨论】:
-
你确定它是
CDialog类,而不是CDialogEx?后者有一些问题。没有任何源代码也很难理解您的问题。 -
课程以
class MessageBoxEx : public CDialog为星号所以,据我所知,课程基于CDialog,对吗?抱歉代码,我不知道要发布什么特定的 sn-ps,而且我不拥有它,所以我不能简单地分享大块。 -
所有对话框都属于同一个线程吗?是的,
EndDialog是用于关闭模式对话框的低级 Windows API 调用。 -
@iinspectable 我知道
EndDialog是正确的,但我不知道CDialog类可能在幕后做的其他 事情。显然,它不同于MessageBox(或任何“标准”模态对话框)所做的。我通过为弹出消息的共享函数找到一种方法来解决该问题,以便在适当的情况下始终使用活动模式窗口句柄或主窗口句柄,但我不需要这样做。哦,好吧,我认为这个问题永远不会有答案。不过,感谢大家考虑。 -
我没有立即意识到 MFC 内部所做的任何事情,这会表现出您观察到的行为。确保查看 CDialog 的 c'tor:
pParentWnd参数具有默认值。如果您不传递父级(实际上是所有者),MFC 将寻找合适的所有者窗口。看到minimal reproducible example 提供定向帮助肯定会有所帮助。