// 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()再编译,看效果!有了。 好了 至于问什么,就自己看代码吧。 ======== 上面连接是什么地方的,我忘了,
但是加一点东西,就可以使用了我转贴下面的东西: =========
刚开始以为在 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()再编译,看效果!有了。 好了 至于问什么,就自己看代码吧。
======== 上面连接是什么地方的,我忘了,
--
基于对话框的程序 的菜单 是不能 直接使用UPDATE_COMMAND_UI 的当然用我上面的代码就可以了~ 呵呵`