void CUserManagerDlg::OnInitMenu(CMenu* pMenu) 
{
CDialog::OnInitMenu(pMenu);

// TODO: Add your message handler code here
HTREEITEM hCurrentItem = m_treeLinkman.GetSelectedItem (); if(hCurrentItem == NULL)
{
return;
} //***********************************************************************
// Load the popup menu HMENU hPopupMenu = ::LoadMenu ( ((CUserManagerApp *)::AfxGetApp ())->m_hInstance, 
MAKEINTRESOURCE (IDR_USERMANAGER_MENU)); HMENU hSubMenu = ::GetSubMenu (hPopupMenu, 1); DWORD dwItemData = m_treeLinkman.GetItemData (hCurrentItem); if(dwItemData == ROOT_ITEM_DATA)
{
::EnableMenuItem (hSubMenu, ID_NEW_LINKMAN, MF_BYCOMMAND | MF_GRAYED);
//::EnableMenuItem (hSubMenu, ID_NEW_GROUP, MF_BYCOMMAND | MF_GRAYED);
::EnableMenuItem (hSubMenu, ID_DELETE, MF_BYCOMMAND | MF_GRAYED);
::EnableMenuItem (hSubMenu, ID_PROPERTY, MF_BYCOMMAND | MF_GRAYED);
}
else
{
//::EnableMenuItem (hSubMenu, ID_NEW_LINKMAN, MF_BYCOMMAND | MF_GRAYED);
::EnableMenuItem (hSubMenu, ID_NEW_GROUP, MF_BYCOMMAND | MF_GRAYED);
//::EnableMenuItem (hSubMenu, ID_DELETE, MF_BYCOMMAND | MF_GRAYED);
//::EnableMenuItem (hSubMenu, ID_PROPERTY, MF_BYCOMMAND | MF_GRAYED);
}

}我的本意是要灰化菜单,可偏不按我的意思做,真想把电脑给砸了!
设置断点,明明程序经过此函数.

解决方案 »

  1.   

    ... , MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
      

  2.   

    ::EnableMenuItem(hSubMenu,ID_FILE_NEW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
      

  3.   

    To zswzwy(←圣骑士!帕迪拉斯!) ( ) :
    你的话让我想起了周星驰主演的微小宝了:)
      

  4.   

    void CUserManagerDlg::OnInitMenu(CMenu* pMenu) 
    {
    CDialog::OnInitMenu(pMenu);

    // TODO: Add your message handler code here
    HTREEITEM hCurrentItem = m_treeLinkman.GetSelectedItem (); if(hCurrentItem == NULL)
    {
    return;
    } //***********************************************************************
    // Load the popup menu HMENU hPopupMenu = ::LoadMenu ( ((CUserManagerApp *)::AfxGetApp ())->m_hInstance, 
    MAKEINTRESOURCE (IDR_USERMANAGER_MENU)); HMENU hSubMenu = ::GetSubMenu (hPopupMenu, 1); DWORD dwItemData = m_treeLinkman.GetItemData (hCurrentItem); if(dwItemData == ROOT_ITEM_DATA)
    {
    ::EnableMenuItem (hSubMenu, ID_NEW_LINKMAN, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
    //::EnableMenuItem (hSubMenu, ID_NEW_GROUP, MF_BYCOMMAND | MF_GRAYED);
    ::EnableMenuItem (hSubMenu, ID_DELETE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
    ::EnableMenuItem (hSubMenu, ID_PROPERTY, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
    }
    else
    {
    //::EnableMenuItem (hSubMenu, ID_NEW_LINKMAN, MF_BYCOMMAND | MF_GRAYED);
    ::EnableMenuItem (hSubMenu, ID_NEW_GROUP, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
    //::EnableMenuItem (hSubMenu, ID_DELETE, MF_BYCOMMAND | MF_GRAYED);
    //::EnableMenuItem (hSubMenu, ID_PROPERTY, MF_BYCOMMAND | MF_GRAYED);
    }

    }还是不行,没道理,我开始贴的代码我用来灰化(在别的函数里)弹出式菜单可以的.
      

  5.   

    灰化菜单应该在WM_INITMENU消息里进行 吧?
      

  6.   

    我来吧我的意思说清楚:
    我的意思想在点击某个CTreeCtrl中的项目时,相应的菜单项目被灰化掉,如何处理?
      

  7.   

    你的程序是对话框的吧?对话框中好像不能这么做。
    应该在OnInitMenuPopup()里面进行。
      

  8.   

    是对话框,但我的弹出式菜单搞定了.
    我在模拟foxmail的管理部分,点击某个条目的时候,灰化相应的弹出式菜单(这部分我已经搞定)和普通菜单
      

  9.   

    void CUserManagerDlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
    {
    CDialog::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);

    // TODO: Add your message handler code here
    HTREEITEM hCurrentItem = m_treeLinkman.GetSelectedItem (); if(hCurrentItem == NULL)
    {
    return;
    } //***********************************************************************
    // Load the popup menu HMENU hPopupMenu = ::LoadMenu ( ((CUserManagerApp *)::AfxGetApp ())->m_hInstance, 
    MAKEINTRESOURCE (IDR_USERMANAGER_MENU)); HMENU hSubMenu = ::GetSubMenu (hPopupMenu, 1); DWORD dwItemData = m_treeLinkman.GetItemData (hCurrentItem); if(dwItemData == ROOT_ITEM_DATA)
    {
    ::EnableMenuItem (hSubMenu, ID_NEW_LINKMAN, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
    //::EnableMenuItem (hSubMenu, ID_NEW_GROUP, MF_BYCOMMAND | MF_GRAYED);
    ::EnableMenuItem (hSubMenu, ID_DELETE, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
    ::EnableMenuItem (hSubMenu, ID_PROPERTY, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
    }
    else
    {
    //::EnableMenuItem (hSubMenu, ID_NEW_LINKMAN, MF_BYCOMMAND | MF_GRAYED);
    ::EnableMenuItem (hSubMenu, ID_NEW_GROUP, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
    //::EnableMenuItem (hSubMenu, ID_DELETE, MF_BYCOMMAND | MF_GRAYED);
    //::EnableMenuItem (hSubMenu, ID_PROPERTY, MF_BYCOMMAND | MF_GRAYED);
    }
    }还是不行.up!
      

  10.   

    你有没有OnUpateMenu的函数,封掉试试
      

  11.   

    看来楼主很偏爱SDK呀
    你那段代码不要放在CWnd::OnInitMenuPopup  和CWnd::OnInitMenu  中,你要响应树形控件的TVN_SELCHANGED消息,如何把这段代码放到这个消息的映射函数中。TRY
      

  12.   

    开始就在TVN_SELCHANGED这里试的,不行啊.
    upupup!!!
      

  13.   

    to fz_zhou(vcfan):
           怎么讲?
    那该如何处理呢?
      

  14.   

    fz_zhou(vcfan) ( ) 讲得有道理楼主除了贴出来的这部分代码,还有没有与菜单有关的代码,在多贴一点出了。
      

  15.   

    ha ha! look MSDN!
    ///////////////////////////////////////////////////////
    CWnd::OnInitMenu  
    afx_msg void OnInitMenu( CMenu* pMenu );ParameterspMenuSpecifies the menu to be initialized. May be temporary and should not be stored for later use
    /////////////////////////////////////////////////////////////
    the pMenu maybe temporary!
      

  16.   

    void CUserManagerDlg::OnClickListLinkman(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    // TODO: Add your control notification handler code here

    m_bTreeItemSelected = false;
    *pResult = 0;
    }void CUserManagerDlg::OnClickTreeLinkman(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    // TODO: Add your control notification handler code here m_bTreeItemSelected = true;

    *pResult = 0;
    }BOOL CUserManagerDlg::OnCommand(WPARAM wParam, LPARAM lParam) 
    {
    // TODO: Add your specialized code here and/or call the base class
    return CDialog::OnCommand(wParam, lParam);
    }void CUserManagerDlg::OnFind() 
    {
    // TODO: Add your control notification handler code here
    CFindDlg *pDlg = new CFindDlg; pDlg->Create (IDD_FIND_DIALOG, this); pDlg->ShowWindow (SW_SHOW);
    }void CUserManagerDlg::OnCreateLinkman() 
    {
    // TODO: Add your control notification handler code here
    OnNewLinkman ();

    }void CUserManagerDlg::OnCreateGroup() 
    {
    // TODO: Add your control notification handler code here
    OnNewGroup ();
    }void CUserManagerDlg::OnDeleteSelected() 
    {
    // TODO: Add your control notification handler code here
    OnDelete ();
    }void CUserManagerDlg::OnSelectedProperty() 
    {
    // TODO: Add your control notification handler code here
    OnProperty ();

    }void CUserManagerDlg::OnSelchangingTreeLinkman(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    // TODO: Add your control notification handler code here
    *pResult = 0;
    }
      

  17.   

    you can do like this:
    //////////////////////////////////////////////////////
    void CUserManagerDlg::OnSelchangingTreeLinkman(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    // TODO: Add your control notification handler code here
             CMenu* pDlgMnu = GetMenu();
             assert( pDlgMenu );
             pDlgMnu->EnableMenuItem(ID_MENU_TEST1, MF_GRAYED ); 

    *pResult = 0;
    }