VC下动态改变菜单显示的标题和Checked状态(Change title of CMenu and Checked)

作者:Wupei  |  发表时间:  |  所属分类:VC

曾经为这个一度苦闷,终于有一天找到了…估计不是最合理的办法
使用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.

请在这里留言: