在编写游戏地图编辑器时涉及到菜单项的动态添加和动态响应,本文记录了碰到的一些问题和解决方法。
因为游戏地图是分层次存储和显示的,所以在编辑器主菜单中有个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)就少一个菜单项,其后的菜单
因为游戏地图是分层次存储和显示的,所以在编辑器主菜单中有个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)就少一个菜单项,其后的菜单