分享
 
 
 

MFC中菜单项的动态添加、删除与响应

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

在编写游戏地图编辑器时涉及到菜单项的动态添加和动态响应,本文记录了碰到的一些问题和解决方法。

因为游戏地图是分层次存储和显示的,所以在编辑器主菜单中有个Layer菜单,这个菜单中的菜单项除了一个"Show Only"菜单项和一个Sperator,其它的菜单项是根据地图中的层数和层的名字动态添加的,所以在编译期无法知道菜单项的个数,也无法用ON_COMMAND宏将这些菜单项与命令处理函数相关联。本来还有一个ON_COMMAND_RANGE宏,可以将某个范围内的ID与一个Command Handler相关联,但是这样的话,我必须在这个宏中指定最大的ID号。因为我不知道实际的地图到底会有多少层,所以我不想让动态添加的菜单项在ID上有个上限。

Layer菜单的第一个菜单项是"Show Only",它响应了UPDATE_COMMAND_UI消息,我在这个响应函数里先删除"Show Only"之后的所有菜单项,然后检查地图实际有多少层,取得地图各层的名字,再根据实际的层数添加菜单项。

删除菜单项的代码如下:

nItemCount = pLayerMenu->GetMenuItemCount();

for (i = 2;i < nItemCount;i++)

{

pLayerMenu->DeleteMenu(i,MF_BYPOSITION);

}

这样删除的话就有问题。因为我是根据菜单项的位置来删除的,而每执行一次

pLayerMenu->DeleteMenu(i,MF_BYPOSITION)就少一个菜单项,其后的菜单项的位置偏移就会减一,最后删除的结果就非我所预期的了。

解决办法是用MF_BYCOMMAND根据ID来删除,或者

nItemCount = pLayerMenu->GetMenuItemCount();

for (i = 2;i < nItemCount;i++)

{

pLayerMenu->DeleteMenu(2,MF_BYPOSITION);

}

这样我就能保证删除所有上一次动态添加上去的菜单项了。

动态添加菜单项我是这样做的:

nLayerCount = pMaterialDoc->GetLayerCount();

for (i = 0;i < nLayerCount;i++)

{

pLayerMenu->AppendMenu(

MF_STRING | MF_ENABLED | MF_CHECKED,

ID_LAYER_SHOW_ONLY + i + 1,

pMaterialDoc->GetLayerName(i));

}

但是这样添加上去的菜单项全是灰色的,即使我用了MF_ENABLED选项。因为MFC

中会自动地让没有Command Handler与之对应的菜单项变灰。这是由CFrameWnd中的

m_bAutoMenuEnable变量控制的,它为true时,MFC做确定菜单项是否应该变灰的工作,为false时,由我们自己做。我只希望我动态添加的菜单项全部是Enabled的,其它菜单的Enable问题还是由MFC来处理。那我应该怎么办呢?

通过跟踪MFC源码我得知,MFC确定一个Command ID是否有Handler与之对应是通过调用OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) 然后根据返回值来确定的。返回值为true, 表示有对应的处理函数,返回值为false,表示没有。那MFC如何保证在检测一个Command ID是否有Handler时,不会无谓地调用这个Handler呢?注意第四个参数pHandlerInfo,当pHandlerInfo不为NULL时,表示是在检测,当其为NULL时,表示是真的在路由这个命令消息,希望能得到处理。

我重载了GMapView(继承自CView,用来显示游戏地图)的OnCmdMsg(...)函数,因为我想在GMapView中处理这些动态添加的菜单项。

nMaxPos = pLayerMenu->GetMenuItemCount() - 1;

if (0 == nCode)

{

if (pLayerMenu->GetMenuItemID(2) <= nID

&& nID <= pLayerMenu->GetMenuItemID(nMaxPos))

{

if (NULL == pHandlerInfo)

{

handler();

}

return true;

}

}

return CView::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);

nCode为0表示是命令消息,为-1就表示是UPDATE_COMMAND_UI消息。我在动态添加菜单项时让它们的ID顺序递增,这样方便处理。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有