搞过MFC的朋友应该玩过
void CMainFrame::OnUpdateEditCut(CCmdUI* pCmdUI)
{
}
这个函数。 一个MFC默认程序中,编辑子菜单下的剪切菜单项处于索引为2的位置:。 而在工具栏中的剪切按钮处于索引为4的位置:。 如果在函数体中仅仅输入:
pCmdUI->Enable(); 一段代码,那么默认为disable的剪切项目在菜单栏和工具栏上的两个位置都将被enable。 如果在函数体中加上一个判断语句,写成:
if (pCmdUI->m_nIndex==2)
{
pCmdUI->Enable();
}那么只有编辑菜单中的剪切被使能了,因为那一个剪切索引号为2,而工具栏上的剪切按钮没有被使能,因为它的索引号为4。 这是令人费解的,因为:照理说,加不加这个判断语句,那么pCmdUI->Enable(); 这句话都是可以执行的,既然刚才那两条语句是无视if 语句而必然执行的,那为什么执行出来的结果不一样? 难道pCmdUI->m_nIndex这个过程包含了什么不为人知的操作?——m_nIndex又不是函数,仅仅只是一个int变量,所以问题不在这里。 那问题在哪里?
C++菜单更新问题
答案:1 悬赏:30 手机版
解决时间 2021-04-06 07:32
- 提问者网友:自食苦果
- 2021-04-06 01:33
最佳答案
- 五星知识达人网友:像个废品
- 2021-04-06 03:11
这是Enable的实现源码,可以看下就能找到答案了,MFC提供的部分源码可是好东西:
void CCmdUI::Enable(BOOL bOn)
{
if (m_pMenu != NULL)
{
if (m_pSubMenu != NULL)
return; // don't change popup menus indirectly
ASSERT(m_nIndex < m_nIndexMax);
m_pMenu->EnableMenuItem(m_nIndex, MF_BYPOSITION |
(bOn ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
}
else
{
// enable/disable a control (i.e. child window)
ASSERT(m_pOther != NULL);
// if control has the focus, move the focus before disabling
if (!bOn && (::GetFocus() == m_pOther->m_hWnd))
m_pOther->GetParent()->GetNextDlgTabItem(m_pOther)->SetFocus();
m_pOther->EnableWindow(bOn);
}
m_bEnableChanged = TRUE;
}
void CCmdUI::Enable(BOOL bOn)
{
if (m_pMenu != NULL)
{
if (m_pSubMenu != NULL)
return; // don't change popup menus indirectly
ASSERT(m_nIndex < m_nIndexMax);
m_pMenu->EnableMenuItem(m_nIndex, MF_BYPOSITION |
(bOn ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
}
else
{
// enable/disable a control (i.e. child window)
ASSERT(m_pOther != NULL);
// if control has the focus, move the focus before disabling
if (!bOn && (::GetFocus() == m_pOther->m_hWnd))
m_pOther->GetParent()->GetNextDlgTabItem(m_pOther)->SetFocus();
m_pOther->EnableWindow(bOn);
}
m_bEnableChanged = TRUE;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯