代码之家  ›  专栏  ›  技术社区  ›  n1ckp

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

  •  4
  • n1ckp  · 技术社区  · 16 年前

    我有以下问题:如果我没有相应消息的消息映射条目(比如id_mybutton1),则MFC将禁用我的工具栏(ctoolbar)控件。有办法解决这个问题吗?我在菜单上也有同样的问题,但是我发现可以通过将cframewnd::m_bautomenuenable设置为false来禁用自动禁用,但是我找不到ctoolbar的类似成员。

    我想我可以添加重定向到空函数的处理程序,但是如果我可以不使用“技巧”就停止这种行为,那就更好了。

    谢谢

    2 回复  |  直到 16 年前
        1
  •  2
  •   zdan    16 年前

    添加一个 在更新命令界面上 工具栏中每个控件的处理程序。像这样:

    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.

        2
  •  1
  •   Community Mohan Dere    9 年前

    就像我在回答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,不知道为什么会这样,但现在一切似乎都正常了,所以谢谢大家的帮助。

    推荐文章