从ini文件里写动态菜单。小女子先谢了,急!!!!

axiang80 2005-12-08 02:55:32
我想从dll接口中将要动态生成的菜单的名称写入menu.ini文件中,再根据menu.ini动态生成菜单。
现menu.ini如下:
[主菜单]
驾驶员注册信息=!NULL
[驾驶员注册信息]
驾驶员基本信息注册=!NULL
驾驶员银行开户信息注册=LoadDllPlug
[驾驶员基本信息注册]
aa=LoadDllPlug
bb=!NULL
[bb]
ww=LoadDllPlug
vv=LoadDllPlug

其中“主菜单"是一级菜单,若键"驾驶员注册信息"为“!NULL”,表示还有下级菜单,直至键不等于"!NULL".
求算法!
若大家有更好的方法或者可以提供源码参考更好了.先谢谢了.分可再加!!!!
...全文
191 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoujiamurong 2006-05-12
  • 打赏
  • 举报
回复
mark
axiang80 2005-12-09
  • 打赏
  • 举报
回复
好的,谢谢,向你学习!^^
快乐鹦鹉 2005-12-09
  • 打赏
  • 举报
回复
blog是有。不过有价值的东西不多。
http://blog.csdn.net/happyparrot
因为本人C++基础比较差,文笔也不行,所以不会写文章。
axiang80 2005-12-09
  • 打赏
  • 举报
回复
嗯,按这种实现思路应该只能这样了。再次谢谢happyparrot(快乐鹦鹉) 。对了,不知happyparrot(快乐鹦鹉)有没有自己的blog或介绍一些比较好的学习地方或方法。
快乐鹦鹉 2005-12-09
  • 打赏
  • 举报
回复
那就只能在每个SECTION后增加编号了。为每个菜单定义编号。比如 文件-1,编辑-2
子菜单中:打印-12,恢复-21这样。每个菜单用一个字符代表,可以从1-9,A-Z,估计够了。然后每个菜单项都要包含其整个路径的字符。比如一个深层次的子菜单的SECTION可能是这样的:
退出-132A422,其上级菜单的编号自然是132A42了。从上到下和从下到上搜索都没有问题。
axiang80 2005-12-09
  • 打赏
  • 举报
回复
谢谢happyparrot(快乐鹦鹉) ,可以递归实现了。
但我这种方法还是有问题,因为菜单就像树和文件夹一样,可能存在不同级下有相同名字的情况,而只用[section]来判断是不够的。不知大家都是怎样实现的?
快乐鹦鹉 2005-12-08
  • 打赏
  • 举报
回复
//这里改写递归该怎样写?
要做递归函数的。
void ReadMenu(CString sPopupMenu)
{
int iCount = Ini.GetKeyValues();//读取spopupmenu节信息。
CMenu * mnuSub;
mnuSub = new CMenu[iCount];
for( int j=0;j<iCount;j++ )
{
mnuSub[j].CreatePopupMenu();
if( arrSubValue[j] == "!NULL" )
{
ReadMenu(arrSubValue[j]);
}
else
mnuMain[i].AppendMenu(MF_STRING | MF_POPUP, lIdCommand++, arrSubKey[j]);
}
}

}
duyhui 2005-12-08
  • 打赏
  • 举报
回复
只能用递归写了,一行一行读
axiang80 2005-12-08
  • 打赏
  • 举报
回复
CMenu *pMenuMain = GetMenu();
int iMainNowCount = pMenuMain->GetMenuItemCount();
CIni Ini;
int iMainCount = 1;
long lIdCommand = ID_COMMAND;
CStringArray arrMainKey,arrMainValue;
Ini.SetFileName("D:\\MyProjects\\YHYHKHXX\\SplitView\\menu.ini");
iMainCount = Ini.GetKeyValues(arrMainKey,arrMainValue,"主菜单");//根据section名读取键名和键值
CMenu * mnuMain;
mnuMain = new CMenu[iMainCount];

for( int i=0;i<iMainCount;i++ )
{
CStringArray arrSubKey,arrSubValue;
mnuMain[i].CreateMenu();
pMenuMain->InsertMenu(iMainNowCount-1+i, MF_BYPOSITION | MF_POPUP, (UINT)mnuMain[i].m_hMenu,arrMainKey[i]);

//这里改写递归该怎样写?
if( arrMainValue[i]=="!NULL" )
{
int iCount = Ini.GetKeyValues(arrSubKey,arrSubValue,arrMainKey[i]);
CMenu * mnuSub;
mnuSub = new CMenu[iCount];
for( int j=0;j<iCount;j++ )
{
mnuSub[j].CreatePopupMenu();
if( arrSubValue[j] == "!NULL" )
{
mnuMain[i].AppendMenu(MF_STRING | MF_POPUP, (UINT)mnuSub[j].m_hMenu,arrSubKey[j]);
//这里还要继续判断......
}
else
mnuMain[i].AppendMenu(MF_STRING | MF_POPUP, lIdCommand++, arrSubKey[j]);
}
}

}


happyparrot(快乐鹦鹉),请指教!
axiang80 2005-12-08
  • 打赏
  • 举报
回复
菜单ID,事件是!NULL的最后一项.如:vv=TcZhuC!LoadDllPlug;TcZhuC为dll,LoadDllPlug为方法.可是我知道用递归不会写.这个有些麻烦.
快乐鹦鹉 2005-12-08
  • 打赏
  • 举报
回复
这个好办啊。先将主菜单节的内容读出。如果某个子项值为!NULL,那么读出该子项名称,以该名称为节名称,再读取相应节信息;如果不是!NULL,就是菜单项了,直接AppendMenu就可以了。这个过程可以是一个递归过程。
主要问题是,你的菜单ID怎么办?菜单的响应事件怎么产生呢?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧