高级会员
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
|
【转帖】加载并显示以及卸载局部菜单
加载并显示以及卸载局部菜单
加载并显示以及卸载局部菜单
作者不对使用本源代码代码的正确性做任何明显或隐含的保证,使用本源代码造成的损失请使用者自负。
用于加载局部菜单,使用了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
|