【问题标题】:How to check if CWnd message map contains message id without handling message?如何在不处理消息的情况下检查 CWnd 消息映射是否包含消息 ID?
【发布时间】:2015-12-18 12:11:07
【问题描述】:

ParentWnd 包含名为 modeOfOperation 的 mfc 控件(下拉列表)。当 modeOfOperation 为 Normal 时,一切正常。我们添加了新的 modeOfOperation=Extreme。当 modeOfOperation 为 Extreme 时,我想禁用 90% 的现有 ParentWnd 控件,因为它们在 Extreme 模式下不起作用。我有包含数百个 UI 控件的现有代码库。我想在代码中找到一个位置来禁用 90% 的功能,而不会影响其他功能。

我知道我需要禁用的 90% 的 UI 控件位于多个子窗口中。其中之一是 m_childWindow1。我需要判断给定的消息是否由 m_childWindow1,...,m_childWindowN 处理。

所以 ParentWnd 将消息路由到 childWindow。如果给定消息由 childWindow 处理,我想覆盖 childWindow 处理程序。所以我需要像bool CWnd::isMessageIdInMessageMap(int id)这样的功能。

BOOL ParentWnd::OnCmdMsg( UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo ) 
{
if ( nCode == CN_UPDATE_COMMAND_UI )
    {
        CWnd *contents = m_childWindow1->getContents();
        if( contents )
            {
            if( contents->OnCmdMsg( nID, nCode, pExtra, pHandlerInfo ) ) 
                {
                //I want to enter additional code here
                //But I don't want to call contents->OnCmdMsg
                return true;
                }
            }
        }
    }
...
}

【问题讨论】:

  • “所以我需要像bool CWnd::isMessageIdInMessageMap(int id) 这样的函数。” - 为什么?只需调用OnCmdMsg 并让框架处理消息处理程序查找。如果没有CmdTarget 处理特定消息,则返回false。请阅读Command Routing。无论如何,您的问题急需编辑。正如所发布的,很难说你真正在寻找什么。
  • 我正在寻找没有副作用的函数 CWnd::isMessageIdInMessageMap(int id)。我不想调用 OnCmdMsg,因为它具有启用 cmd 等副作用 - 它对用户可见。
  • 是的,这就是你的问题。我请你澄清,为什么你认为这会有所帮助。
  • 我有 200 个 m_childWindow 处理程序,我不想在每个处理程序中插入代码来禁用 UI 控制。我想在一个地方做。
  • 这无助于澄清,你真正追求的是什么。请更新您的问题,使其包含所有相关信息。现在,您似乎决定选择错误的解决方案,现在需要帮助。我怀疑这是解决您实际问题的方法。但是,在不知道自己真正想要做什么的情况下,很难说清楚。

标签: mfc controls cwnd


【解决方案1】:

只需使用现有函数 (OnCmdMsg)。

创建您自己的 CCmdUI 对象(如果需要,覆盖 Enable... 函数)作为 pExtra 参数传递给 OnCmdMsg,并且您在调用后知道它是否是处理程序。

没有副作用...

【讨论】:

    猜你喜欢
    • 2018-09-12
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 2017-09-13
    相关资源
    最近更新 更多