我写了个基于对话框应用程序,我把系统的菜单加入到对话框里面,但我的菜单需要用SetCheck()设置选中方式,但等我写好了以后发现这么一回事情:就是我用在我更新消息如下:
消息映射:ON_UPDATE_COMMAND_UI_RANGE( ID_1,ID_24, OnUpdateCheck )处理函数:void CEFONTDlg::OnUpdateCheck(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( m_ChooseCheckMenu == MenuIDToIndex(pCmdUI->m_nID) ;
}//其中MenuIDToIndex是我将菜单id更换为一个UINT型值然后和同为UINT
//的m_ChooseCheckMenu 比较我老是选不中,然后我开始调试,发现原来基于对换框的时候我跟踪SetCheck时候发现程序调用了Mfc里面wincore.cpp的一个如下的函数
void CTestCmdUI::SetCheck( int )
{
// do nothing -- just want to know about calls to Enable
}
函数里面什么也不做,这个CTestCmdUI类一查发现他是从CCmdUI继承过来的,但基于视图方式我调试发现SetCheck里面有内容的,这是怎么回事情?请大虾把其中原理说个清楚好吗?我基于对换框的该如何解决这个问题?真是想不通,同是调用CCmdUI类其同一个setcheck()函数调试发现调的库里面setcheck()代码不一样这如何解决?

解决方案 »

  1.   

    让对话框响应WM_INITMENUPOPUP消息响应函数:
    void CMyDlg::OnInitMenuPopup(CMenu *pPopupMenu, UINT, BOOL)
    {
        UpdateMenu(pPopupMenu);
    }UpdateMenu函数的实现:
    void CMyDlg::UpdateMenu(CMenu *pMenu)
    {
        CCmdUI cmdUI;
        cmdUI.m_nIndexMax = pMenu->GetMenuItemCount();
        for(UINT n = 0; n < cmdUI.m_nIndexMax; ++n)
        {
            CMenu* pSubMenu = pMenu->GetSubMenu(n);
            if(pSubMenu == NULL)
            {
                cmdUI.m_nIndex = n;
                cmdUI.m_nID = pMenu->GetMenuItemID(n);
                cmdUI.m_pMenu = pMenu;
                cmdUI.DoUpdate(this, FALSE);
            }
    else
    {
    UpdateMenu(pSubMenu);
    }
        }
    }
      

  2.   

    谢谢gufengduyu(聪明的呆呆龙) 
    这个东东我也找了好久了,
    十分感谢