我写了个基于对话框应用程序,我把系统的菜单加入到对话框里面,但我的菜单需要用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()代码不一样这如何解决?
消息映射: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()代码不一样这如何解决?
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);
}
}
}
这个东东我也找了好久了,
十分感谢