我写了个基于对话框的程序,现在想在程序开始运行时对话框上的菜单是禁用的,登陆以后才可以使用,请问怎么操作?谢谢了!

解决方案 »

  1.   

    基于对话框的程序 的菜单 是不能 直接使用UPDATE_COMMAND_UI 的
      但是加一点东西,就可以使用了我转贴下面的东西:  =========
    刚开始以为在 void CXXXDlg::OnUpdateUpdataServer(CCmdUI *pCmdUI)中设置个pCmdUI->mybool ; 就ok了,谁知道这么的麻烦。菜单是不可用了,但是没有灰化,谁让我使用的是对话框呢?所有就问别人为什么了?结果[iwaswzq]兄弟告诉我要添加一个函数的。于是给了我一个函数(嘿嘿,我最喜欢直接要代码看了)如下:void CXXXDlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
    {
        if (!bSysMenu)
        {
            ASSERT(pPopupMenu != NULL);
            
            // check the enabled state of various menu items
            CCmdUI state;        
            state.m_pMenu = pPopupMenu;
            ASSERT(state.m_pOther == NULL);
            
            state.m_nIndexMax = pPopupMenu->GetMenuItemCount();
            for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;
                 state.m_nIndex++)
            {
                state.m_nID = pPopupMenu->GetMenuItemID(state.m_nIndex);
                if (state.m_nID == 0)
                    continue; // menu separator or invalid cmd - ignore it
                    
                ASSERT(state.m_pOther == NULL);
                ASSERT(state.m_pMenu != NULL);
                if (state.m_nID == (UINT)-1)
                {
                    // possibly a popup menu, route to first item of that popup
                    state.m_pSubMenu = pPopupMenu->GetSubMenu(state.m_nIndex);
                    if (state.m_pSubMenu == NULL ||
                        (state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 ||
                        state.m_nID == (UINT)-1)
                    {                                 
                        continue; // first item of popup can't be routed to
                    }
                    state.DoUpdate(this, FALSE);  // popups are never auto disabled
                }
                else
                {
                    // normal menu item
                    // Auto enable/disable if command is _not_ a system command
                    state.m_pSubMenu = NULL;
                    state.DoUpdate(this, state.m_nID < 0xF000);
                }
            }
        }
     }
    于是我忙得不亦乐乎的,头文件中增加函数声明,cpp中增加函数,一切就绪,运行。结果还是没有灰化!再问!回答:消息影射了么?没有!所以就没有用了。于是添加影射:BEGIN_MESSAGE_MAP(CcontrolDlg, CDialog)ON_WM_INITMENUPOPUP()END_MESSAGE_MAP()再编译,看效果!有了。 好了 至于问什么,就自己看代码吧。
    ======== 上面连接是什么地方的,我忘了,
      

  2.   

    对比一下sdi和mdi的(和对话框)的自动生成代码,当然是添加了UPDATE_COMMAND_UI之后的,再摸索一下就出来了,呵呵
      

  3.   

    gamezealot(「我愛羅」:集材潜心铸魔剑...) 
    --
    基于对话框的程序 的菜单 是不能 直接使用UPDATE_COMMAND_UI 的当然用我上面的代码就可以了~ 呵呵`