在本论谈中有许多关于动态生成菜单的贴子,但是都是在原来菜单中添加,我是想整个菜单均由程序自动生成,请各位高手指点,这个事我已经试了好长时间,请各位帮帮忙!!!!!!!!!!!!
气球的
http://blog.csdn.net/balloonman2002/archive/2004/06/28/28708.aspx
为什么要创建动态菜单?我其实更倾向于创建好菜单,然后根据需要隐藏掉一部分菜单项。也就是采用类似于权限控制的手段来显示需要的部分。
动态创建菜单不外乎采用另外一种数据格式来保存菜单数据,然后用自定义的算法构造出菜单而已,这些其实都可以由pb的menu paint完成的。
我觉得唯一适用动态创建的菜单是右键弹出式的菜单,不同对象,甚至是同一个对象有不同状态的时候,可能都需要不同的弹出菜单,很难创建适用于所有对象所有状态的弹出菜单,这时候,才可能需要动态创建菜单数据、再动态创建菜单的功能。
整个动态添加,从文件中?正好我以前做过
以下是我以前写的动态从文件中添加菜单的VC DLL源码 ,完整
//---------------------------------------------------------------------------
//参数:dest为输出的被截后的字符串,source为源传入的字符串,nFlags为要截的目标
// 参数为1:截取菜单名,参数为2:截取菜单图标;参数为3:返回菜单的索引
// 4为1则取菜单名,为2则取菜单图象string
//返回:返回该字符串左侧空格的个数
//---------------------------------------------------------------------------
int StringTok(CString& dest,const CString &source,CString &sPosition,int nFlags=1)
{
int index = 0;
for(int i=0;i<source.GetLength();i++)
{
if(0x20 == source.GetAt(i)){index++;continue;} //如果字符串左侧为空格则继续循环直到字符串左侧非空格
if(0 == index && sPosition != "00000000") //如果该字符串的空格数为0:
{
int l = atoi(sPosition.Mid(0,1));
sPosition.Format("%d%s",++l,"0000000"); //sPosition的第一位+1: "11111111" = "20000000" ,右侧全部清空
break;
}
else if(4 == index)
{
int l = atoi(sPosition.Mid(1,1));
sPosition.Format("%s%d%s",sPosition.Left(1),++l,"000000"); //第二位+1:"22222222" = "23000000"
break;
}
else if(8 == index)
{
int l = atoi(sPosition.Mid(2,1));
sPosition.Format("%s%d%s",sPosition.Left(2),++l,"00000"); //第三位+1:"33333333" = "33400000"
break;
}
else if(12 == index)
{
int l = atoi(sPosition.Mid(3,1));
sPosition.Format("%s%d%s",sPosition.Left(3),++l,"0000"); //第四位+1:"44444444" = "44450000"
break;
}
else if(16 == index)
{
int l = atoi(sPosition.Mid(4,1));
sPosition.Format("%s%d%s",sPosition.Left(4),++l,"000"); //第五位+1:"55555555" = "55556000"
break;
}
else if(20 == index)
{
int l = atoi(sPosition.Mid(5,1));
sPosition.Format("%s%d%s",sPosition.Left(5),++l,"00"); //第六位+1:"66666666" = "66666700"
break;
}
else if(24 == index)
{
int l = atoi(sPosition.Mid(6,1));
sPosition.Format("%s%d%s",sPosition.Left(6),++l,"0"); //第七位+1:"77777777" = "77777780"
break;
}
else if(28 == index)
{
int l = atoi(sPosition.Mid(7,1));
sPosition.Format("%s%d",sPosition.Left(7),++l); //第八位+1:"88888888" = "88888889"
break;
}
break;
}
if(1 == nFlags) //如果标志为截取菜单名
{
if(source.Find(,)<=0)dest = source.Mid(index);
else dest = source.Mid(index,source.Find(,) - index); //取出菜单名到第一个参数引用中
}
return index;
}
能否全部在PB中实现,最好不要用API函数
总应该有一个根菜单吧只要有一个根菜单应该都可以创建出来的
动态菜单的好处就是把功能从程序中可以进行独立出来
再结合动态DATAWINDOW,有的时候加个功能就很方便不必编译程序
很爽的