zenggq 发表于 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[
在程序中假设希望点击ID_FANCOMPUTE 菜单后,ID_FANBLADESHOW菜单变灰
int fan_compute()
{
       acedMenuCmd("fan.ID_FANBLADESHOW= ~");
       ……
}
这样好象没反应耶,怎么回事呢?
另外,菜单项变灰了后再想使它可用,又该怎么办呢?
thx!

willcan 发表于 2005-8-27 11:22:00

楼主是不是用LISP来调用自定义菜单的?能否贴出你的LISP代码给我一个参考啊?谢谢!

zenggq 发表于 2005-8-27 13:39:00

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

willcan 发表于 2005-8-28 09:34:00

zenggq 你好,能不能分享一下你用ARX加载菜单的代码呢?
我现在也需要加载我自己定义的菜单,做了一个*.mnu文件,但不知道如何在ARX里加载.
谢谢

zenggq 发表于 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;
// 循环所有菜单组,寻找菜单组,if false, load "fan.mnu".
VARIANT vtName;
vtName.vt = VT_I4;
BSTR grpName;
bool found = false;
for (long i = 0; i 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"

zenggq 发表于 2005-8-28 10:47:00

前面不是有好几位大虾解答了如何让菜单变灰的方法嘛?
现在怎么没人出来指点一下偶的问题呢?

willcan 发表于 2005-8-28 13:17:00

zenggq ,谢谢你分享的代码!

zenggq 发表于 2005-8-29 20:04:00

顶到有人回答为止,呵呵!
召唤版主大人现身!

zenggq 发表于 2005-9-2 14:24:00

没人回答偶
MY heart will be broken!

skymudy 发表于 2013-2-4 20:03:00

俺也想学习一下
页: [1]
查看完整版本: 请教个人定制的菜单的控制问题