【问题标题】:MFC Menu Item not properly invoking a modal dialogMFC 菜单项未正确调用模式对话框
【发布时间】:2012-05-19 05:33:17
【问题描述】:

我创建了一个带有一些控件(编辑、文本等)的简单对话框并保存 放到GME/GME.rc/Dialog的资源文件夹中

我添加了一个自动生成的事件处理程序,它创建了一个新类(Class.cpp 出于本示例的目的)注意: Class::Class(CWnd *pParent) : CDialogEx(Class::IDD, pParent) 构造函数为空,我不确定是否是 相关,但我不认为是..

有一个 MESSAGE_MAP COMMAND(menu_item_id, &class::member_function()) Class.cpp 中的调用是自动生成的。它被包裹在 标准 BEGIN_MESSAGE_MAP 宏的东西。

但是:当单击菜单项时,该项目保持灰色。这 “enabled=true”和“gray=false”的属性都正确 配置。所以,我认为这是错误是由于消息处理程序不是 已注册。

任何帮助将不胜感激。

【问题讨论】:

  • 你如何显示菜单?
  • 从 IDR_MAINFRAME 菜单中,我添加了一个菜单,右键单击“添加事件处理程序”并选择 CUserInformation 类来处理 COMMAND 消息类型。 pastie.org/3891015 pastie.org/3891019
  • 我仍然没有看到任何生成菜单的代码,而且我不知道有什么方法可以将菜单添加到对话框中。
  • 该菜单由双击 GME.rc 对话框后弹出的框架自动生成。

标签: mfc


【解决方案1】:

没有代码,很难提供帮助。您确定将菜单 ID 的消息处理程序放在 CView、CFrame、CDocument 或 CWinApp 派生类中吗?如果你把菜单处理程序放在你的对话框类中,它对你没有多大好处。

【讨论】:

  • 该死!基类是 CDialogEx。所以理想情况下,MESSAGE_MAP/ON_COMMAND 的东西应该去哪里?在主要的 ::InitInstance() 中?
  • 如果您的目标是在选择菜单项后运行模式对话框,则将 ON_COMMAND 处理程序添加到您的 CView 派生类或 CMainFrame 类。在处理程序内部,在堆栈上声明 CDialog 派生类的实例并调用 DoModal()。
【解决方案2】:

对话框不包含通过 MFC 用来启用菜单项的 ON_UPDATE_COMMAND_UI 处理程序列表运行的代码。例如,通常这是由 CFrameWnd 处理的。尝试在 OnInitDialog 函数中调用 UpdateDialogControls

我发现您的代码也缺少菜单项的 ON_UPDATE_COMMAND_UI 宏,即使它引用的处理程序是为您创建的。

【讨论】:

    【解决方案3】:

    您将菜单项处理程序添加到具有菜单的窗口,通常是 CMainFrame。将消息映射和处理程序复制到 CMainFrame 并查看是否有帮助。我不确定您要在这里做什么-我假设您想在单击菜单项时显示“类”(也许更好地编辑您的帖子以调用此“示例对话框”或其他东西...),对?或者您是否以某种方式向您的 CDialogEx 派生类添加了一个菜单?如果是最后一个,我想这就是 Mark 所指的——“你如何显示菜单”?您如何手动向对话框中添加菜单?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 2011-07-03
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多