【问题标题】:Unexpected CDialog DoModal() behavior意外的 CDialog DoModal() 行为
【发布时间】: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 提供定向帮助肯定会有所帮助。

标签: windows mfc


【解决方案1】:

不知道我的回答对你有没有一点帮助。

但是有一个对话框的属性 - “系统模式”,这使它成为系统模式对话框。

如果您将其设置为 True,您的对话框将成为系统模式对话框。

【讨论】:

  • 但是“系统模式”禁止输入除消息框之外的所有内容,这不是我想要的(实际上这很糟糕。)对我来说最重要的是替换调用基于CDialog 的消息框类对象调用实际的MessageBox 函数会产生预期的行为:其他模式对话框在关闭后仍会阻止对父应用程序的任何其他输入。类没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 2013-11-25
  • 1970-01-01
  • 2020-10-04
  • 2016-07-16
  • 2016-05-10
相关资源
最近更新 更多