VC下动态改变菜单显示的标题和Checked状态(Change title of CMenu and Checked)
曾经为这个一度苦闷,终于有一天找到了…估计不是最合理的办法
使用ModifyMenu函数,原型如下:
/*************************************************** * 4个参数: * nPosition - 旧菜单的资源ID或位置(根据nFlags取值) * nFlags - MF_BYCOMMAND or MF_BYPOSITION 前者用资源ID标识,后者用位置标识 * nIDNewItem - 设置菜单为新的资源ID或新的位置(根据nFlags取值) * lpszNewItem - 菜单所显示字符串 ***************************************************/ BOOL ModifyMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
演示代码:
//鼠标右键单击弹出选单 CMenu menu; menu.LoadMenu(IDR_MY_MENU); //载入事先定义的选单 CMenu* pMenu=menu.GetSubMenu(0); if(m_isShow) { pMenu->ModifyMenu( ID_MENUITEM_ONE, MF_BYCOMMAND, ID_MENUITEM_ONE, "第一个标题" ); } else { pMenu->ModifyMenu( ID_MENUITEM_ONE, MF_BYCOMMAND, ID_MENUITEM_ONE, "第二个标题" ); } CPoint pos; GetCursorPos(&pos); //获取当前鼠标位置(相对全屏幕位置) pMenu->TrackPopupMenu( //弹出菜单 TPM_LEFTALIGN|TPM_RIGHTBUTTON, pos.x,pos.y, AfxGetMainWnd() );
动态改变菜单Checked状态
//原型 /*************************************************** * 2个参数: * nIDCheckItem - 菜单资源ID或位置 * nCheck - MF_BYCOMMAND,MF_BYPOSITION,MF_CHECKED,MF_UNCHECKED * Return Value:The previous state of the item: MF_CHECKED or MF_UNCHECKED, or 0xFFFFFFFF if the menu item did not exist. ***************************************************/ UINT CheckMenuItem( UINT nIDCheckItem, UINT nCheck );
演示:
CMenu* secondMenu = pMenu->GetSubMenu(0); secondMenu->CheckMenuItem(ID_MENUITEM_AUTOCLOSE,MF_UNCHECKED); //改变为无对勾状态
Trackback from your site.