【问题标题】:Using a dialog box as a main window. Not receiving WM_INITDIALOG messages使用对话框作为主窗口。未收到 WM_INITDIALOG 消息
【发布时间】:2021-08-07 13:43:07
【问题描述】:

我已经创建了一个无模式对话框作为主窗口,但是没有向窗口过程发送 WM_INITDIALOG 消息。

这就是我所做的。

  1. 使用 Visual Studio 的资源编辑器创建了一个对话框模板,并且 将其类名设置为自定义类。
  2. 使用 WNDCLASSEX 注册类、窗口过程,以及 一些图标和画笔等。
  3. 使用 CreateDialog(),最后两个参数设置为 NULL,(父 窗口和窗口过程)。
  4. 使用 IsDialogMessage()、TranslateMessage() 创建了消息循环 和 DispatchMessage();
  5. 如果没有,则在窗口过程中返回 DefDlgProc() 作为默认值 消息已处理。

我想不出还有什么重要的事情。除了没有收到 WM_INITDIALOG 消息外,一切正常。 我这样做是为了让应用最小化到任务栏,如果需要我可以有一个菜单。

所以我的第一个问题是,我做了什么蠢事吗?

其次,我应该期望使用这个系统接收 WM_INITDIALOG 消息吗? 如果没有,什么是初始化带有字符串的组合框的好方法。 (我看过 WM_ACTIVATE、WM_ACTIVATEAPP 等,但似乎没有什么合适的。 并且组合框尚未在 WM_CREATE 创建。) 提前致谢。

【问题讨论】:

  • 在创建子窗口之前,确保它的父窗口已经完全创建
  • 一定要区分对话过程和窗口过程。对于对话框,窗口过程是在 Windows 本身中实现的。每当与对话相关的事情发生时,它都会调用对话过程,例如 WM_INITDIALOG。它是调用 DefDlgProc() 的那个。所以现在您知道第 3 步是错误的,您没有对话过程。示例is here.
  • 感谢 seddpur 和汉斯。汉斯,那个例子并没有最小化到任务栏,我认为你不能有菜单。这就是我使用自定义对话框的原因。
  • 一些windows文档说如果我使用对话框作为主窗口,程序必须调用DefDlgProc。但我找到了我的问题的答案,我将很快发布。它绝对是一个窗口过程而不是一个对话框过程。 (我以为我复制了对话框类(GetClassInfo())并用它来创建一个新类,但那肯定是另一个应用程序。无论如何,现在一切都按预期工作了。
  • WM_INITDIALOGDefDlgProc() 直接发送到您的对话过程。它不会发布到您的消息队列中。你需要一个对话过程来接收它。

标签: c++ winapi modeless-dialog


【解决方案1】:

我在发布后不久就意识到了答案。 正如上面的 cmets 中提到的,它是一个窗口过程,而不是一个对话框过程,所以我不应该尝试在过程中初始化子窗口。

所以我在创建对话框之后和消息循环之前在过程之外初始化了它们。 所有对话框功能都按预期工作,但它是一个主窗口,可以有一个菜单并最小化到任务栏。

【讨论】:

  • 我不确定您为什么认为普通对话框不能最小化到任务栏,因为它们当然可以。您可以使用SetMenu() 向对话框添加菜单。
  • 谢谢乔纳森。对我来说一定是一头雾水。
猜你喜欢
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多