明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2518|回复: 9

请教个人定制的菜单的控制问题

[复制链接]
发表于 2005-8-27 09:08:00 | 显示全部楼层 |阅读模式

个人定制好的菜单,希望通过程序控制其一些子菜单项可用或不可用

其实以前的贴子也有了介绍,但是偶照着做好象不行,不知道哪里出了问题

还请哪位达人指点一二:

首先个人定制的菜单:

***Comment
        版权所有 (C) ……大学流体工程所
***MENUGROUP=fan

***POP1
[风机(&F)]
[--]
ID_FANCOMPUTE [气动计算(&C)]^C^CFAN_COMPUTE
[--]
ID_FANBLADE [->叶片设计(&B)]
ID_FANBLADESHAPE [叶片造型(&M)]^C^CFAN_SHAPE
ID_FANBLADESHOW  [<-风叶显示(&S)]^C^CFAN_SHOW

在程序中假设希望点击ID_FANCOMPUTE 菜单后,ID_FANBLADESHOW  菜单变灰

int fan_compute()

{

       acedMenuCmd("fan.ID_FANBLADESHOW  = ~");

       ……

}

这样好象没反应耶,怎么回事呢?

另外,菜单项变灰了后再想使它可用,又该怎么办呢?

thx!

发表于 2005-8-27 11:22:00 | 显示全部楼层
楼主是不是用LISP来调用自定义菜单的?能否贴出你的LISP代码给我一个参考啊?谢谢!
 楼主| 发表于 2005-8-27 13:39:00 | 显示全部楼层

呵呵不是的,就是用ARX加载菜单的

发表于 2005-8-28 09:34:00 | 显示全部楼层

zenggq 你好,能不能分享一下你用ARX加载菜单的代码呢?

我现在也需要加载我自己定义的菜单,做了一个*.mnu文件,但不知道如何在ARX里加载.

谢谢

 楼主| 发表于 2005-8-28 10:39:00 | 显示全部楼层


//加载菜单
void loadMenu()
{
 // 取得AutoCAD应用程序对象
 IAcadApplication *acadApp = NULL;
 LPDISPATCH pDisp = NULL;

 if (!getApplication(&pDisp))
 {
  acadApp->Release();
  return;
 }
 HRESULT hr = S_OK;

 hr = pDisp->QueryInterface(IID_IAcadApplication, (LPVOID*)&acadApp);
 if (FAILED(hr))
 {
  acadApp->Release();
  return;
 }
 // 取得所有菜单组
 IAcadMenuGroups *mnuGrps = NULL;
 long cnt = 0;
 hr = acadApp->get_MenuGroups(&mnuGrps);
 if (FAILED(hr))
 {
  acadApp->Release();
  return;
 }
 acadApp->Release();
 // 菜单组个数
 mnuGrps->get_Count(&cnt);
 IAcadMenuGroup *mnuGrp = NULL;
 // 循环所有菜单组,寻找[fan]菜单组,if false, load "fan.mnu".
 VARIANT vtName;
 vtName.vt = VT_I4;
 BSTR grpName;
 bool found = false;
 for (long i = 0; i < cnt; i++)
 {
  vtName.lVal = i;
  hr = mnuGrps->Item(vtName, &mnuGrp);
  if (FAILED(hr))
   return;
  hr = mnuGrp->get_Name(&grpName);
  CString cgrpName(grpName);
  if (cgrpName.CompareNoCase("fan") == 0)
  {
   found = true;
   break;
  }
 }
 mnuGrps->Release();
 if (found == false)
 {
//  CommandB();
  CString mac = "(COMMAND \"_MENULOAD\" \"fan.mnu\")";
  if (acDocManager->curDocument())
  {
   acedPostCommand(mac);
   //如果P12不存在,则新载入的菜单加到当前菜单最后面
   acedPostCommand("(menucmd \"P11=+fan.pop1\")");  
  }
//  CommandE();
 }
 mnuGrp->Release();
 return;
}

bool getApplication(LPDISPATCH * pVal)
{
 LPDISPATCH pDispatch = acedGetAcadWinApp()->GetIDispatch(TRUE);
 if (pDispatch == NULL)
  return false;
 *pVal = pDispatch;
 return true;
}

 另外loadmenu函数要加入到入口函数的case AcRx::kInitAppMsg:下面,这样AutoCAD可以自动加载它

再加上下面两个头文件(很大的头文件,我也不知道可不可以加小一点的头文件)

#include "acad15.h"
#include "acad15_i.c"

 楼主| 发表于 2005-8-28 10:47:00 | 显示全部楼层

前面不是有好几位大虾解答了如何让菜单变灰的方法嘛?

现在怎么没人出来指点一下偶的问题呢?

发表于 2005-8-28 13:17:00 | 显示全部楼层
zenggq ,谢谢你分享的代码!
 楼主| 发表于 2005-8-29 20:04:00 | 显示全部楼层

顶到有人回答为止,呵呵!

召唤版主大人现身!

 楼主| 发表于 2005-9-2 14:24:00 | 显示全部楼层

没人回答偶

MY heart will be broken!

发表于 2013-2-4 20:03:10 | 显示全部楼层
俺也想学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 07:42 , Processed in 0.177133 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表