Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MFC';s";“更新命令界面”;系统工作?_C++_Visual Studio 2010_User Interface_Mfc_Toolbar - Fatal编程技术网

C++ MFC';s";“更新命令界面”;系统工作?

C++ MFC';s";“更新命令界面”;系统工作?,c++,visual-studio-2010,user-interface,mfc,toolbar,C++,Visual Studio 2010,User Interface,Mfc,Toolbar,我想更多地了解这个系统是如何工作的,特别是框架实际决定何时以及如何更新UI元素 我的应用程序有一个“工具”系统,其中一个工具可以同时处于活动状态。我使用“ON_UPDATE_COMMAND_UI”消息来“检查”UI中工具的图标/按钮,这会影响应用程序菜单和工具栏。无论如何,这一切都很好,直到最近几天的某个时候,工具栏图标不再正确高亮显示 我进行了一些调查,发现只有在实际单击图标时才收到更新命令。奇怪的是,这只会影响工具栏,而不会影响菜单,菜单仍然可以正常工作。即使菜单中的按钮已更新,工具栏图标仍

我想更多地了解这个系统是如何工作的,特别是框架实际决定何时以及如何更新UI元素

我的应用程序有一个“工具”系统,其中一个工具可以同时处于活动状态。我使用“ON_UPDATE_COMMAND_UI”消息来“检查”UI中工具的图标/按钮,这会影响应用程序菜单和工具栏。无论如何,这一切都很好,直到最近几天的某个时候,工具栏图标不再正确高亮显示

我进行了一些调查,发现只有在实际单击图标时才收到更新命令。奇怪的是,这只会影响工具栏,而不会影响菜单,菜单仍然可以正常工作。即使菜单中的按钮已更新,工具栏图标仍保持不变

显然我做了些什么来打破它-有什么想法吗

编辑: 不要介意。我已经覆盖了应用程序的
OnIdle()
方法,并且没有调用原始的基类方法-也就是说,
CWinApp::OnIdle()
-我想大部分时间都是在这里调用更新的。来自的此代码片段演示了:

BOOL CMyApp::OnIdle(LONG lCount)
{
   // CWinApp's original method is involved in the update message handling!
   // Removing this call will break things
   BOOL bMore = CWinApp::OnIdle(lCount);

   if (lCount == 0)
   {
      TRACE(_T("App idle for short period of time\n"));
      bMore = TRUE;
   }
   // ... do work

   return bMore;
   // return TRUE as long as there are any more idle tasks
}
看看这是否有帮助-

这里有一个解释如何做。但是,不要将他的代码示例用于WM_KICKIDLE,而是向下滚动到comments部分。有两个代码示例解释如何更好地执行此操作。我引述:

//Override WM_INITMENUPOPUP
void CDialog::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
    CDialog::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);

    // TODO: Add your message handler code here
    if(pPopupMenu && 
        !bSysMenu)
    {
        CCmdUI CmdUI;
        CmdUI.m_nIndexMax = pPopupMenu->GetMenuItemCount();

        for(UINT i = 0; i < CmdUI.m_nIndexMax; i++)
        {
            CmdUI.m_nIndex = i;
            CmdUI.m_nID = pPopupMenu->GetMenuItemID(i);
            CmdUI.m_pMenu = pPopupMenu;

            // There are two options:

            // Option 1. All handlers are in dialog
            CmdUI.DoUpdate(this, FALSE);

            // Option 2. There are handlers in dialog and controls
/*
            CmdUI.DoUpdate( this, FALSE );

            // If dialog handler doesn't change state route update
            // request to child controls. The last DoUpdate will
            // disable menu item with no handler
            if( FALSE == CmdUI.m_bEnableChanged )
                CmdUI.DoUpdate( m_pControl_1, FALSE );

            ...

            if( FALSE == CmdUI.m_bEnableChanged )
                CmdUI.DoUpdate( m_pControl_Last, TRUE );
*/
        }       
    }
}
//重写WM_INITMENUPOPUP
无效CDialog::OnInitMenupOpp(CMenu*pOppMenu、UINT nIndex、BOOL bSysMenu)
{
CDialog::OnInitMenuPopup(ppopmenus、nIndex、bsysmenus);
//TODO:在此处添加消息处理程序代码
如果(PPOppMenu&&
!b菜单)
{
CCmdUI;
CmdUI.m_nIndexMax=ppopumenu->GetMenuItemCount();
对于(UINT i=0;iGetMenuItemID(i);
CmdUI.m_pMenu=pPopupMenu;
//有两种选择:
//选项1.所有处理程序都在对话框中
CmdUI.DoUpdate(这个,FALSE);
//选项2.对话框和控件中有处理程序
/*
CmdUI.DoUpdate(这个,FALSE);
//如果对话框处理程序不更改状态,则路由更新
//请求子控件。最后一次更新将
//禁用没有处理程序的菜单项
if(FALSE==CmdUI.m_bEnableChanged)
CmdUI.DoUpdate(m_pControl_1,FALSE);
...
if(FALSE==CmdUI.m_bEnableChanged)
CmdUI.DoUpdate(m_pControl_Last,TRUE);
*/
}       
}
}

如果您将您的解决方案作为此问题的答案发布,那将非常好(这样,当其他人遇到此问题时,他们可以从您的经验中受益)。如果你解释你发现了什么,就可以获得双倍的奖励积分。你可以在两天后接受你自己的答案。-1因为没有通过发布答案来帮助社区。抱歉,我已经在这里不活跃了很长一段时间。希望我的编辑能说明我的问题是由什么引起的;我只是忘记了在重写最初的OnIdle函数时添加对它的调用。