在项目中用了右键弹出菜单,为了方便后续查询,而且现在我使用的代码也是经过验证的整理好的代码,供后续快速使用,而不必在网上到处找,还不一定靠谱。
针对弹出菜单,我还做了菜单文字修改的处理,用于显示菜单对应的状态的改变。这个因为临时查所以花了一些时间,走了点弯路,在此分享出来,给大家一个靠谱的代码参考。方便自己,方便他人。
首先贴出代码,然后再对代码做详细解释,再分享一下前面自己遇到的一些问题。
CMenu menu;
menu.LoadMenu(IDR_MENU_TREND);
CMenu* pContextMenu=menu.GetSubMenu(1); //获取第一个弹出菜单,所以第一个菜单必须有子菜单
int sort_type = 0;//这个值从外部获取,我是从配置文件里读取的。这里直接设置值,方便测试。
if(sort_type==0)
{
pContextMenu->ModifyMenu(ID_SORT_ASC,MF_POPUP,ID_SORT_ASC,_T("升序排列 ?"));
pContextMenu->ModifyMenu(ID_SORT_DESC,MF_POPUP,ID_SORT_DESC,_T("降序排列"));
}
else
{
pContextMenu->ModifyMenu(ID_SORT_ASC,MF_POPUP,ID_SORT_ASC,_T("升序排列"));
pContextMenu->ModifyMenu(ID_SORT_DESC,MF_POPUP,ID_SORT_DESC,_T("降序排列 ?"));
}
pContextMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pt.x,pt.y,AfxGetMainWnd()); //在指定位置显示弹出菜单
菜单的效果图:
升序排列和降序排列一次只能选择一个,选择的菜单需要选中。所以,我们需要修改菜单的文字。这里没有使用菜单项前面的状态图标,因为这个需要一些机制来更新,比较麻烦。相对于改文字来说,非常方便。
网上一些人说不要改向导生成的菜单项的ID,说改了ID后,菜单响应会失效。默认的ID是ID_23412这样的,看起来不知道是什么。当然,在给菜单添加事件响应前,就要修改好菜单的ID,然后再添加事件响应。如果你先添加好事件响应,再改ID,那就会导致事件响应失效。
然后就是,ModifyMenu函数使用不当,导致修改了文字后,事件失效。使用不当,是因为网上很多代码是错误的,害得我饶了一个圈。还是经过查询MSDN来纠正,最后跑通的。看来,偷懒也是要付出代价的。
ModifyMenu函数第一个参数和第三个参数为要修改的菜单ID,第二个为MF_POPUP,最后一个为菜单的文字。基本是,这个用法是固定的,对于右键弹出菜单来说,前面三个可以固定,你需要修改的就是最后的参数。
那么这里还遇到一个问题,ModifyMenu函数使用正确了,但是菜单的文字却没有修改过来。这个问题是因为TrackPopupMenu函数执行之后在执行ModifyMenu函数。因为ModifyMenu函数并不是实时更新到菜单界面上去,在ModifyMenu函数执行后,在执行TrackPopupMenu函数,这样才能让菜单项文字修改生效。顺序很重要。
前面三行代码的第三行,获取的是子菜单1,因为我创建了两个菜单,用了第二个,所以子菜单的索引就是1了。这里说明一下。你可以创建很多个子菜单,然后随意加载其中一个子菜单。