![]() |
【转帖】加载并显示以及卸载局部菜单
加载并显示以及卸载局部菜单
加载并显示以及卸载局部菜单 作者不对使用本源代码代码的正确性做任何明显或隐含的保证,使用本源代码造成的损失请使用者自负。 用于加载局部菜单,使用了menuload、menuunload两个cad命令。 //加载局部菜单 bool loadpartialmenu( const char* filepath //局部菜单文件名 , const char* menugroupname //局部菜单组名 ) { resbuf psrcrb; resbuf* pdestrb = null; if (acedgetvar("filedia", &psrcrb) != rtnorm) return false; if ((pdestrb = acutbuildlist(rtshort, 0, rtnone)) == null) return false; //不显示对话框,改为命令行 if (acedsetvar("filedia", pdestrb) != rtnorm) { acutrelrb(pdestrb); return false; } acutrelrb(pdestrb); //加载菜单 if (acedcommand(rtstr, "menuload", rtstr, filepath, 0) != rtnorm) { acedsetvar("filedia", &psrcrb); return false; } //加载局部菜单完毕,恢复原始状态 acedsetvar("filedia", &psrcrb); //显示局部菜单 int i, j, n; vector<string> menulist; char menucmd[512]; //依次在主菜单条最后插入菜单,局部菜单不能达到一百个^-^ for (i = 0; i < 100; i++) { //当前主菜单条上的菜单数肯定不会超过二百个^-^ sprintf(menucmd, "=+%s.pop%d", menugroupname, i + 1); acedmenucmd(menucmd); } //如果菜单已存在则系统会继续提示输入菜单文件,所以必须发送取消命令 menucmd[0] = 27; menucmd[1] = '\0'; acdocmanager->sendstringtoexecute(curdoc(), menucmd); return true; } //卸载局部菜单 void removepartialmenu(const char* menugroupname) { resbuf psrcrb; resbuf* pdestrb = null; if (acedgetvar("filedia", &psrcrb) != rtnorm) return ; if ((pdestrb = acutbuildlist(rtshort, 0, rtnone)) == null) return ; //不显示对话框,改为命令行 if (acedsetvar("filedia", pdestrb) != rtnorm) { acutrelrb(pdestrb); return ; } acutrelrb(pdestrb); acedcommand(rtstr, "menuunload", rtstr, menugroupname, 0); //卸载局部菜单完毕,恢复原始状态 acedsetvar("filedia", &psrcrb); } 复制代码 下面代码为加载局部菜单的com方式 //加载局部菜单 bool loadpartialmenu( const tchar* filepath //局部菜单文件名 , const tchar* menugroupname // ) { //如果有的话先卸载 long i, menugroupnum; //菜单组数目 variant index; variantinit(&index); index.vt = vt_i4; cstring strgroupname(menugroupname); cacadapplication acadapp(acedgetacadwinapp()->getidispatch(true)); cacadmenugroups menugroups(acadapp.get_menugroups()); cacadmenugroup menugroup; menugroupnum = menugroups.get_count(); for (i = 0; i < menugroupnum; i++) { index.lval = i; menugroup = menugroups.item(index); if (menugroup.get_name() == strgroupname) { menugroup.unload(); break; } } //加载菜单 variant basemenu; //是否加载为基础菜单 variantinit(&basemenu); basemenu.vt = vt_bool; basemenu.boolval = false; menugroup = menugroups.load(cstring(filepath), basemenu); // 把菜单在菜单条上显示出来 cacadmenubar menubar(acadapp.get_menubar()); //当前菜单条 cacadpopupmenus popupmenus(menugroup.get_menus()); //要加入的菜单条 cacadpopupmenu popupmenu; long curpopupmenunum = menubar.get_count(); //当前菜单条上菜单的数目 long n = popupmenus.get_count(); for (long i = 0; i < n; i++) { index.lval = i; popupmenu = popupmenus.item(index); index.lval = i + curpopupmenunum; popupmenu.insertinmenubar(index); } return true; } 复制代码 [ 本帖最后由 chenaex 于 8-11-27 09:25 pm 编辑 ] 牛 还是不行啊,只加载了,但菜单栏上还是显示不出来啊 程序加载cad局部菜单(test.cui文件)时,加载成功,菜单栏上却不显示环境为 visual studio.net2 +objectarx6+autocad6 cui文件路径为 d:/test.cui test.cui中菜单的组名字为test on_kinitappmsg() 里面这样写的: extern "c" void ads_queueexpr( achar *); //(前面加上的) achar *in=_t("(command \"_.menuload\" \"d:/test.cui\")"); ads_queueexpr(in);//这里将test.cui文件载入成功了 acedmenucmd("p1=test.pop1");//这句就是网上查到的,说是可以显示下拉菜单,但却不行啊 acedmenucmd("p22=test.pop1");//这样也不行啊 将该arx文件加载到cad6,下面提示说test组加载成功,但菜单栏上就是没显示test这个下拉菜单 弄了好几天了,还是不行。 谢谢飞猫 终于用你写的com加载好了o(∩_∩)o |
所有的时间均为北京时间。 现在的时间是 12:10 AM. |