有关菜单更新的问题!!!高手指教! ON_UPDATE_COMMAND_UI_RANGE(MIN_MENU_ID,MAX_MENU_ID,OnUpdateMenu)能否通过消息拦截的方法去实现上面的宏所实现的功能呢?已经把窗口子类化,可以获得所有的消息.请高手指点,分不够还可以给.... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我的菜单是动态生成的,所以我拦截了所有消息,只不过刚加进的菜单全是灰化的.我希望能在菜单状态更新那里把菜单全使能化.也就是如下:void CMainFrame::OnUpdateMenu(CCmdUI* pCmdUI){ pCmdUI->Enable();}在拦截WM_INITMENUPOPUP,没办法把动态加进的菜单使能化,调用的是EnableMenuItem 函数 不需要拦截WM_INITMENUPOPUP,直接处理菜单所属窗口的WM_INITMENUPOPUP就可以了。另,动态加入或修改菜单后,应调用DrawMenuBar(hWnd)使菜单立即得到更新。 直接处理菜单所属窗口的WM_INITMENUPOPUP就可以了--------------------------------------------------我的菜单是动态加在某个下拉菜单里面的,所以不用DrawMenuBar也可以的呀(我在ActivateFrame函数里面添加菜单的),只是我希望把加进的菜单变成使能而已.我处理的是菜单所属窗口的WM_INITMENUPOPUP消息.能否更详细点? LRESULT CALLBACK newWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){ switch(uMsg) { case WM_COMMAND: { WORD nId =LOWORD(wParam) ; if((nId >= 8888) && (nId <= 9999)) AfxMessageBox(_T("Hello")); } break; case WM_INITMENUPOPUP: { } break; } return CallWindowProc(oldWndProc,hWnd,uMsg,wParam,lParam);} 加进的菜单变成使能一般用SetMenuInfo或EnableMenuItem,如果更改的是window menu, 使用后必须立即调用DrawMenuBar 好像不可以用EnbleMenuItem,如果要用这个函数好像要把m_bAutoMenuEnable 这个变量设为FALSE,这样就会把原本其他菜单的使能化变乱了. 看你上面的代码,用的是SDK API如果用win32 SDK API,会发现MFC中的可能出现的问题在这里都不存在了。(MFC框架使用虽方便,但也会将一些简单的操作复杂化)。EnableMenuItem只修改你指定的菜单项的状态,对其他项无影响。 EnableMenuItem只修改你指定的菜单项的状态,对其他项无影响。------------------------------------这个我知道,但用这个函数之前需要把m_bAutoMenuEnable = FALSE;设置这个变量,会使原本主菜单灰掉的选项变成使能了,这一切都发生在我加动态菜单项之前的. 我现在基本已不用MFC,m_bAutoMenuEnable的副作用不是很了解。如果直接使用API,根本不存在这种问题。仔细看了一下,你似乎用的是窗口子类化。不知为什么要这么用。另:如果你处理了WM_INITMENUPOPUP, 应返回0case WM_INITMENUPOPUP:{ }return 0L; 用窗口子类化的原因是因为,我封装了一个可以动态创建删除菜单的类,里面已经可以完成一切的菜单处理,现在只少一点点缺陷,就是刚开始的时候新加的菜单会灰掉,我需要在FRAME里面添加ON_UPDATE_COMMAND_UI_RANGE(MIN_MENU_ID,MAX_MENU_ID,OnUpdateMenu)void CMainFrame::OnUpdateMenu(CCmdUI* pCmdUI){ pCmdUI->Enable();}因为我希望能把所有与动态菜单相关的操作放在我地类里面,SO..... 简单界面问题 COM编程如何入门 在一个程序中调用另一个程序的功能 求解非模态对话框销毁问题 Edit控件如何设置行高? DEBUG和RELEASE问题 CString的菜鸟问题,麻烦各位大哥帮助解决一下,急死我了!!! 用ADO却不能读取dbf中的数字型的数据?大伙帮我看看VariantToCtring 情问那里有中文版的MSDN可以下载?? 调用IDispatch::Invoke为何总是出错?内祥 工具栏按钮直接要设置分割线,怎么弄?用可视化方法可以吗? CreateProcess创建内核对象的问题
也就是如下:
void CMainFrame::OnUpdateMenu(CCmdUI* pCmdUI)
{
pCmdUI->Enable();
}在拦截WM_INITMENUPOPUP,没办法把动态加进的菜单使能化,调用的是EnableMenuItem 函数
直接处理菜单所属窗口的WM_INITMENUPOPUP就可以了
--------------------------------------------------我的菜单是动态加在某个下拉菜单里面的,所以不用DrawMenuBar也可以的呀(我在ActivateFrame函数里面添加菜单的),只是我希望把加进的菜单变成使能而已.我处理的是菜单所属窗口的WM_INITMENUPOPUP消息.能否更详细点?
{
switch(uMsg)
{
case WM_COMMAND:
{
WORD nId =LOWORD(wParam) ;
if((nId >= 8888) && (nId <= 9999))
AfxMessageBox(_T("Hello"));
}
break;
case WM_INITMENUPOPUP:
{
}
break;
}
return CallWindowProc(oldWndProc,hWnd,uMsg,wParam,lParam);
}
如果用win32 SDK API,会发现MFC中的可能出现的问题在这里都不存在了。(MFC框架使用虽方便,但也会将一些简单的操作复杂化)。EnableMenuItem只修改你指定的菜单项的状态,对其他项无影响。
这个我知道,但用这个函数之前需要把m_bAutoMenuEnable = FALSE;
设置这个变量,会使原本主菜单灰掉的选项变成使能了,这一切都发生在我加动态菜单项之前的.
仔细看了一下,你似乎用的是窗口子类化。不知为什么要这么用。另:如果你处理了WM_INITMENUPOPUP, 应返回0
case WM_INITMENUPOPUP:
{
}
return 0L;
ON_UPDATE_COMMAND_UI_RANGE(MIN_MENU_ID,MAX_MENU_ID,OnUpdateMenu)void CMainFrame::OnUpdateMenu(CCmdUI* pCmdUI)
{
pCmdUI->Enable();
}因为我希望能把所有与动态菜单相关的操作放在我地类里面,SO.....