MFC 菜单项保持灰色

问题描述 投票:0回答:3

我有一个名为 Properties 的

CDialogEx
类,我在其中处理
ON_COMMAND
消息。现在,当我单击菜单项
ON_COMMAND
(作为主菜单的子菜单)时,应该调用
ID_EDIT_PROPERTIES
。事件处理程序向导为我编写了该代码,但是当我启动应用程序时,菜单项保持灰色。我尝试在
EnableMenuItem
发生时通过调用
ON_UPDATE_COMMAND_UI
来手动激活它,但没有成功。

任何帮助将不胜感激。

mfc
3个回答
2
投票

您只需要了解如何处理菜单项启用/禁用:

  • 如果既没有 ON_COMMAND 也没有 ON_UPDATE_COMMAND_UI 处理程序,则该项目被禁用。
  • 如果不存在 ON_UPDATE_COMMAND_UI 处理程序,但当前活动文档或视图(甚至“大型机”)中存在 ON_COMMAND 处理程序,则启用该项目。
  • 如果存在 ON_UPDATE_COMMAND_UI 处理程序,则启用/禁用该项目由处理程序决定 (
    pCmdUI->Enable(bEnableState)
    )。

另请记住:

  • 您不能自己调用
    EnableMenuItem()
    ,而是在 ON_UPDATE_COMMAND_UI 处理程序中调用
    pCmdUI->Enable(bEnableState)
    。这不仅影响菜单项,还影响任何其他“命令”类型的项目(具有相同的 ID),例如主菜单、上下文菜单、工具栏或钢筋按钮。
  • 将处理程序放在哪里是应用程序设计的问题,取决于您正在处理或表示的数据。它可以放在大型机类中(如果它依赖于某些“全局”数据或设置),文档类中(如果它依赖于或更改文档中的某些数据或设置 - 可能影响所有视图),或者放在视图类(-es)(仅取决于或影响当前视图)。

在你的情况下,如果我理解正确,该项目被禁用,因为处理程序位于 CDialogEx 派生类中,但尚未创建该类的实例,即您的 ID_EDIT_PROPERTIES 命令不存在 ON_COMMAND 处理程序。


2
投票

Per

m_bAutoMenuEnable
,当启用此数据成员(这是默认值)时,当用户下拉菜单时,没有
ON_UPDATE_COMMAND_UI
或 ON_COMMAND 处理程序的菜单项将被自动禁用。


0
投票

我承认我不知道

CDialogEx
是不同的,但是对于
CDialog
我发现
UPDATE_COMMAND_UI
从来没有工作过,除非我处理了 WM_KICKIDLE 事件。

在 OnKickIdle 事件处理程序中调用:

CWnd::UpdateDialogControls

上面有一个简短的教程这里

如果

CDialogEx
取代此信息,请原谅我,我将删除答案。

© www.soinside.com 2019 - 2024. All rights reserved.