永发信息网

C++菜单更新问题

答案:1  悬赏:30  手机版
解决时间 2021-04-06 07:32
搞过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变量,所以问题不在这里。 那问题在哪里?
最佳答案
这是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;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
昆仑玉原石求估价
一位航海家在航海日记中写到:“我在1492年发
6分之一减6分之5等于多少 (要过程)
新民22号货站 长吉货站电话 知道的告诉下 谢
金边吊兰种子什么样子
矛盾的普遍性和特殊性相互联结体现在什么地方
宝宝一岁,怎么补铁最有效
大理石和花岗岩有什么区别?环保吗?
生黑芝麻要炒多久才会熟啊?刚在超市买的黑芝
0.282Nm等于多少ozin
一鞋店试销一种新款女鞋,试销期间卖出情况如
如何打印国税申报表,国税申报表不能打印怎么
短毛狗狗有哪些
大姨吗里的东西是正品吗?
我想五一去大连,什么地方好玩?本地的青年人一
推荐资讯
在“探究水的沸腾”实验中,有两组同学分别使
关于我的中国梦作文素材
五星张裕白兰地有没有3L
帮忙想个口号 上技高一筹用的 我们店名叫奇迹
香港迪士尼好莱坞酒店早餐大人多少小孩多少
学生时代的白羊座女孩异性缘超好,正常吗?
小升初教师对学生赠言,小升初时男生给女生的
沛县龟汁狗肉馆道口铺总店地址在什么地方,想
梦见自己失误点火
本想做妈妈一辈子的小棉袄,可无奈却长成了军
我先前办了两个建行借记卡,开有网银,但长时
根号下(九减四倍根号二)化简等于多少,要
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?