3

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

我的应用程序有一个“工具”系统,一次可以激活一个工具。我使用“ON_UPDATE_COMMAND_UI”消息在 UI 中“检查”工具的图标/按钮,这影响了应用程序菜单和工具栏。无论如何,这一切都很好,直到最近几天的某个时候,工具栏图标停止正确突出显示。

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

显然我已经做了一些事情来打破它 - 有什么想法吗?

编辑: 没关系。我已经覆盖了应用程序的OnIdle()方法并且没有调用原始的基类方法——也就是说,CWinApp::OnIdle()我猜这是大多数时候调用更新的地方。来自https://msdn.microsoft.com/en-us/library/3e077sxt.aspx的此代码片段说明:

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
}
4

2 回答 2

4

这是一篇很好的文章,它解释了如何做到这一点。不要将他的代码示例与 WM_KICKIDLE 一起使用,而是向下滚动到评论部分。有两个代码示例解释了如何做得更好。我引用:

//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 );
*/
        }       
    }
}
于 2015-03-04T00:49:08.557 回答
0

看看这是否有帮助 - http://msdn.microsoft.com/en-us/library/essk9ab2(v=vs.80).aspx

于 2012-06-09T13:15:28.793 回答