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);
}
}我的本意是要灰化菜单,可偏不按我的意思做,真想把电脑给砸了!
设置断点,明明程序经过此函数.
{
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);
}
}我的本意是要灰化菜单,可偏不按我的意思做,真想把电脑给砸了!
设置断点,明明程序经过此函数.
你的话让我想起了周星驰主演的微小宝了:)
{
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);
}
}还是不行,没道理,我开始贴的代码我用来灰化(在别的函数里)弹出式菜单可以的.
我的意思想在点击某个CTreeCtrl中的项目时,相应的菜单项目被灰化掉,如何处理?
应该在OnInitMenuPopup()里面进行。
我在模拟foxmail的管理部分,点击某个条目的时候,灰化相应的弹出式菜单(这部分我已经搞定)和普通菜单
{
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!
你那段代码不要放在CWnd::OnInitMenuPopup 和CWnd::OnInitMenu 中,你要响应树形控件的TVN_SELCHANGED消息,如何把这段代码放到这个消息的映射函数中。TRY
upupup!!!
怎么讲?
那该如何处理呢?
///////////////////////////////////////////////////////
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!
{
// 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;
}
//////////////////////////////////////////////////////
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;
}