如果我没有为它的相应命令声明消息映射条目,如何阻止 MFC 禁用我的控件?

Posted

技术标签:

【中文标题】如果我没有为它的相应命令声明消息映射条目,如何阻止 MFC 禁用我的控件?【英文标题】:How to stop MFC from disabling my controls if I don't declare a message map entry for it's corresponding command? 【发布时间】:2009-10-02 19:15:28 【问题描述】:

我有以下问题:如果我没有相应消息的消息映射条目(比如 ID_MYBUTTON1),MFC 将禁用我的工具栏(CToolbar)控件。有没有解决的办法?我在菜单上遇到了同样的问题,但我发现您可以通过将 CFrameWnd::m_bAutoMenuEnable 设置为 false 来禁用自动禁用,但我找不到 CToolbar 的类似成员。

我想我可以添加重定向到一个空函数的处理程序,但如果我可以在不使用“技巧”的情况下停止这种行为会很好。

谢谢

【问题讨论】:

【参考方案1】:

为工具栏中的每个控件添加一个 ON_UPDATE_COMMAND_UI 处理程序。像这样的:

ON_UPDATE_COMMAND_UI(ID_MYBUTTON1, uiButtonHandler);

void myToolBar::uiButtonHandler(CCmdUI* pCmdUI) 

    pCmdUI->Enable(TRUE); // Or whatever logic you want.

详情read the appropriate section in the MSDN.

【讨论】:

好吧,我不想为我的每个控件添加一个处理程序,否则我会像我在问题中所说的那样为每个控件提供一个空处理程序。不过,谢谢你的回答。我找到了一种方法,只需要覆盖 1 个函数,但它现在不能完全工作。我会发布我所做的并在我完全正常工作时更新它。 这也适用于基于 CDialogBar 的类。我的 CDialogBar 上有一个 PUSHBUTTON,默认情况下它总是被禁用。按照上面@zdan 的建议添加 CCmdUI 处理程序解决了问题。【参考方案2】:

就像我在回复 zdan 的回答时所说的那样,我找到了一种方法。只需像这样覆盖 CToolBar 中的 OnUpdateCmdUI 函数

class MyToolBar : public CToolBar

public:
    virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler)
     return CToolBar::OnUpdateCmdUI(pTarget, FALSE);

bDisableIfNoHndler 标志是负责告诉工具栏在未找到处理程序时禁用按钮的标志,因此我只是将其强制为 FALSE。

虽然现在我遇到了另一个问题。工具栏看起来不错,但当我按下按钮时它不会发送命令。我不知道为什么,因为如果我从菜单中访问相同的命令,它就可以正常工作。我会尝试看看这是否相关。

感谢您的帮助。

更新:发现我的问题。基本上问题是我的命令处理程序在 MyFrame::PreTranslateMessage 中(在执行了此问题的答案中建议的操作之后:How to redirect MFC messages to another object?),但命令不是通过此函数发送的(尽管从菜单访问时他们确实这样做了)。它们是通过 MyFrame::OnCommand 发送的,所以我只是将代码从 PreTranslateMessage 更改为 OnCommand,现在一切正常。我对 MFC 了解得不够多,无法知道为什么会这样,但现在一切似乎都正常了,所以感谢大家的帮助。

【讨论】:

以上是关于如果我没有为它的相应命令声明消息映射条目,如何阻止 MFC 禁用我的控件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在对话框中处理工具栏消息

编写日志条目时防止GNU Emacs退出

如何将数组数字映射到定时值

如果在jsp中删除记录失败,则显示错误消息

打字稿:如何根据对象键/值类型在 ES6 映射中创建条目

ZipArchive创建无效的ZIP条目