我想在我的 SDI 窗体菜单中动态增加子菜单项,用如下方法:
pDriveMenu->AppendMenu(MF_STRING | MF_ENABLED, IDList[index], name);但是加上的菜单项都是灰色的,对这些菜单项的处理方法是参考 MSDN 里面的,也就是重载 OnCmdMsg,但怎么才能使它可用呢?
pDriveMenu->AppendMenu(MF_STRING | MF_ENABLED, IDList[index], name);但是加上的菜单项都是灰色的,对这些菜单项的处理方法是参考 MSDN 里面的,也就是重载 OnCmdMsg,但怎么才能使它可用呢?
举例:
UINT IDList[5] = {0};//五个子菜单项for(int i = 0;i < 5;i++)
IDList[i] = 32771 + i;//即IDList 的内容为32771 - 32775在窗口的MessageMap 的//}}AFX_MSG_MAP 后边添加宏:
ON_COMMAND_RANGE(32771,32775, OnCtrlMenu)
ON_UPDATE_COMMAND_UI_RANGE(32771,32775, OnUpdateCtrlMenu)//如果需要动态使能的话
添加消息处理函数原型:
afx_msg void OnCtrlMenu(UINT nID);
afx_msg void OnUpdateCtrlMenu(CCmdUI* pCmdUI);
在函数体中如此处理:
void CYourAppView::OnCtrlMenu(UINT nID)
{
switch(nID)
{
case 32771:
//to do your code here as:
AfxMessageBox("this is test menu 32771 !");
break;
//other menu id case
default:
break;
}
}
void CYourAppView::OnUpdateCtrlMenu(CCmdUI* pCmdUI)
{
switch(pCmdUI->m_nID)
{
case 32771:
//to do your code here as:
pCmdUI->Enable(true);//false to grey menu
break;
//other menu id case
default:
break;
}
}
LRESULT CTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch( message )
{
case WM_COMMAND:
switch ( LOWORD( wParam ) )
{
case ID_EXIT:
...
break;
}
}
}