如果我没有为它的相应命令声明消息映射条目,如何阻止 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 禁用我的控件?的主要内容,如果未能解决你的问题,请参考以下文章