几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量  


返回   几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 » 仿射空间:CAX软件开发(三)二次开发与程序设计 » CAD二次开发 » AutoCAD二次开发 » ObjectARX(C++)
用户名
密码
注册 帮助 会员 日历 银行 搜索 今日新帖 标记论坛为已读


 
 
主题工具 搜索本主题 显示模式
旧 2009-04-16, 09:08 PM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 【转帖】加载并显示以及卸载局部菜单

加载并显示以及卸载局部菜单
加载并显示以及卸载局部菜单
作者不对使用本源代码代码的正确性做任何明显或隐含的保证,使用本源代码造成的损失请使用者自负。
用于加载局部菜单,使用了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
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
 


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

vB 代码开启
[IMG]代码开启
HTML代码关闭



所有的时间均为北京时间。 现在的时间是 11:02 AM.


于2004年创办,几何尺寸与公差论坛"致力于产品几何量公差标准GD&T | GPS研究/CAD设计/CAM加工/CMM测量"。免责声明:论坛严禁发布色情反动言论及有关违反国家法律法规内容!情节严重者提供其IP,并配合相关部门进行严厉查处,若內容有涉及侵权,请立即联系我们QQ:44671734。注:此论坛须管理员验证方可发帖。
沪ICP备06057009号-2
更多