SDI菜单属性动态响应

         刚开始学习MFC编程,碰到问题一大堆,还好有孙鑫的VC++讲座的帮忙,受益匪浅!            
         其实我要实现的功能很简单,就是在单文档中打开一幅图像后,将原来一个菜单项从灰色不可用变为亮色可用!在网上找了很多方法,逐个实现,即使编译通过后还是无法实现功能,今天看了孙鑫的讲座后终于可以实现这个功能了,废话不多说了,下面从两个方面实现此功能!      
第一种方法:
1、在DOC类的OnFileOpen消息响应函数中打开一幅图像后,存放在成员变量-句柄m_hDIB中,这是一种图像句柄,据听应用见DIBAPI;
2、在打开图像后,同一段代码的后面,使用下列方法实现此功能:(1)AfxGetMainWnd()->m_hWnd获取CMainFrame窗口的句柄;
(2)HMENU h_menu = GetMenu(AfxGetMainWnd()->m_hWnd);利用API的GetMenu函数从窗口句柄获取菜单句柄;
(3)CMenu* menu = CMenu::FromHandle(h_menu);使用CMenu类的静态成员函数FromHandle将句柄转化为相应指针,这样就得到了菜单指针;
(4)CMenu* submenu = menu->GetSubMenu(4);利用CMenu的成员函数GetSubMenu获取对应菜单的指针;
(5)submenu->EnableMenuItem(ID_GUASS, MF_BYCOMMAND | MF_ENABLED);最后利用子菜单指针的EnableMenuItem改变菜单状态。       
        这个问题的关键在于从DOC类中如何获得窗口类的句柄,菜单句柄以及将菜单句柄转化为菜单指针。
第二种方法:      
        在学习了系统菜单命令更新机制后,找到了新的方法。      
        首先将系统菜单命令更新机制的流程介绍一下:
1、窗口需要显示菜单时,系统会发出WN_INITMENUPOPUP消息;
2、该消息由MFC的基类CMainFrame接管,它会创建一个CCmdUI对象,同时将这个对象与系统菜单的第一个项联系起来;
3、此时这个菜单项会调用CCmdUI对象的DoUpdate()函数,由该函数发出一个CN_UPDATE_COMMAND_UI消息,这个消息上面与第一项菜单关联的CCmdUI对象的指针;
4、此时搜索这个菜单项是否具有响应CN_UPDATE_COMMAND_UI的响应函数,如果有,则将CCmdUI对象的指针作为参数传递进来,以便修改菜单的各项属性;
5、如果没有响应函数,那么CMainFrame将所创建的CCmdUI对象与第二个菜单项进行关联,同时再检测是否有响应第二个菜单的CN_UPDATE_COMMAND_UI消息的响应函数,如此下去检查完所有的菜单完成更新。
        基于以上原理,通过以下步骤可实现我们需要的功能:
1、在DOC类下对需要改变状态的菜单项下加入一个CN_UPDATE_COMMAND_UI的菜单响应函数;
2、建立判定参数以判定加载图像是否成功;
3、void CSteven_ADoc::OnUpdateGuass(CCmdUI *pCmdUI)
{
    // TODO: 在此添加命令更新用户界面处理程序代码
 if (m_hDIB != NULL)
 {
  pCmdUI->Enable();
 }
}
        上述代码中使用指向对应菜单项的CCmdUI 对象指针对该菜单项的状态进行修改。只要m_hDIB != NULL表示加载成功,那么就修改菜单为enable。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值