在中望CAD中添加自定义菜单,一步一步来:
1.新建zrxobject项目,我命名为menuTest2。
2.引入菜单所需要的头文件,这一步很重要。我也是刚开始接触,查了很久,找到的代码都无法使用。后来在同事的帮助下搞定了,在此特别感谢邹建同学。记一下,分享给大家,也留个记录。
(1)右键单击项目,找到属性.
(2)点击打开属性,找到VC++目录,在包含目录和引用目录中加入中望CAD的安装目录,中望SDK目录下的inc文件夹以及目录下的lib-64文件夹,确定。
(3)在菜单栏上找到项目,添加类->MFC->TypeLib中的MFC类,点击添加。
(4)在打开的对话框中->可用的类型库,点击下拉列表,找到红箭头所指(最下面了哈),
从接口中选择和menu有关的接口,点红圈所示的地方,在右边就会看到相应的生成类,依次添加就好。点击完成
至此,准备工作就做完了。现在加代码,完整代码如下,读者可自行修改和添加。
#include "stdafx.h"
#include "SampleDlg.h"
#include "AcExtensionModule.h"
#include "CZcadApplication.h"
#include "CZcadMenuBar.h"
#include "CZcadMenuGroup.h"
#include "CZcadMenuGroups.h"
#include "CZcadPopupMenu.h"
#include "CZcadPopupMenus.h"
#import "ZwAuto.dll"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern HWND adsw_acadMainWnd();
AC_IMPLEMENT_EXTENSION_MODULE(theArxDLL);
void dialogCreate()
{
// Modal
SampleDlg dlg(CWnd::FromHandle(adsw_acadMainWnd()));
int nReturnValue = dlg.DoModal();
zcutPrintf(_T("hello world"));
}
void initApp()
{
// register a command with the AutoCAD command mechanism
CAcModuleResourceOverride resOverride;
acedRegCmds->addCommand(_T("ZRX_DLG_SAMPLE"),
_T("ZRXDLGSAMPLE"),
_T("DLGSAMPLE"),
ACRX_CMD_MODAL,
dialogCreate,
NULL,
-1,
theArxDLL.ModuleResourceInstance());
}
void unloadApp()
{
acedRegCmds->removeGroup(_T("ZRX_DLG_SAMPLE"));
}
//
//
// Entry points
//
//
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
theArxDLL.AttachInstance(hInstance);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
theArxDLL.DetachInstance();
}
return 1; // ok
}
void addMenuThroughMfcCom()
{
TRY
{
//CZcadApplication IAcad(acedGetIDispatch ()->GetIDispatch(TRUE));
CZcadApplication IAcad(acedGetIDispatch(TRUE));
CZcadMenuBar IMenuBar(IAcad.get_MenuBar());
long numberOfMenus;
numberOfMenus = IMenuBar.get_Count();
CZcadMenuGroups IMenuGroups(IAcad.get_MenuGroups());
VARIANT index;
VariantInit(&index);
V_VT(&index) = VT_I4;
V_I4(&index) = 0;
CZcadMenuGroup IMenuGroup(IMenuGroups.Item(index));
CZcadPopupMenus IPopUpMenus(IMenuGroup.get_Menus());
CString cstrMenuName = _T("我的菜单1(&L)");
VariantInit(&index);
V_VT(&index) = VT_BSTR;
V_BSTR(&index) = cstrMenuName.AllocSysString();
IDispatch* pDisp=NULL;
//see if the menu is already there
TRY{pDisp = IPopUpMenus.Item(index); pDisp->AddRef();} CATCH(COleDispatchException,e){}END_CATCH;
VariantClear(&index);
if (pDisp==NULL) {
//create it
CZcadPopupMenu IPopUpMenu(IPopUpMenus.Add(cstrMenuName));
VariantInit(&index);
V_VT(&index) = VT_I4;
V_I4(&index) = 0;
IPopUpMenu.AddMenuItem(index, _T("横断面成图(&H)"), _T("HDM "));
VariantInit(&index);
V_VT(&index) = VT_I4;
V_I4(&index) = 1;
IPopUpMenu.AddMenuItem(index, _T("纵断面成图(&Z)"),_T( "ZDM "));
VariantInit(&index);
V_VT(&index) = VT_I4;
V_I4(&index) = 2;
IPopUpMenu.AddSeparator(index);
VariantInit(&index);
V_VT(&index) = VT_I4;
V_I4(&index) = 3;
IPopUpMenu.AddMenuItem(index, _T("灵宇断面帮助(&B)"), _T("DMHELP "));
pDisp = IPopUpMenu.m_lpDispatch;
pDisp->AddRef();
}
CZcadPopupMenu IPopUpMenu(pDisp);
if (!IPopUpMenu.get_OnMenuBar())
{
VariantInit(&index);
V_VT(&index) = VT_I4;
V_I4(&index) = numberOfMenus - 2;;
IPopUpMenu.InsertInMenuBar(index);
}
else
{
VariantInit(&index);
V_VT(&index) = VT_BSTR;
V_BSTR(&index) = cstrMenuName.AllocSysString();
IPopUpMenus.RemoveMenuFromMenuBar(index);
VariantClear(&index);
}
pDisp->Release();
}
CATCH(COleDispatchException,e)
{
e->ReportError();
e->Delete();
}
END_CATCH;
}
//去掉菜单
void removeMenu()
{
TRY{
CZcadApplication IAcad(acedGetIDispatch(TRUE));
CZcadMenuBar IMenuBar(IAcad.get_MenuBar());
long numberOfMenus;
numberOfMenus = IMenuBar.get_Count();
CZcadMenuGroups IMenuGroups(IAcad.get_MenuGroups());
VARIANT index;
VariantInit(&index);
V_VT(&index) = VT_I4;
V_I4(&index) = 0;
CZcadMenuGroup IMenuGroup(IMenuGroups.Item(index));
CZcadPopupMenus IPopUpMenus(IMenuGroup.get_Menus());
CString cstrMenuName1 = _T("我的菜单(&L)");
VariantInit(&index);
V_VT(&index) = VT_BSTR;
V_BSTR(&index) = cstrMenuName1.AllocSysString();
IPopUpMenus.RemoveMenuFromMenuBar(index);
VariantClear(&index);
}
CATCH(COleDispatchException,e){}END_CATCH
}
extern "C" AcRx::AppRetCode zcrxEntryPoint( AcRx::AppMsgCode msg, void* appId)
{
switch( msg )
{
case AcRx::kInitAppMsg:
acrxDynamicLinker->unlockApplication(appId);
acrxDynamicLinker->registerAppMDIAware(appId);
initApp();
addMenuThroughMfcCom();
break;
case AcRx::kUnloadAppMsg:
removeMenu();
unloadApp();
break;
case AcRx::kInitDialogMsg:
break;
default:
break;
}
return AcRx::kRetOK;
}
生成,注意平台哈,32位还是64位,我是64的位。
找到menutest2.zrx。在中望CAD中加载,命令行输入DLGSAMPLE,ok,菜单出来了。注意:中望CAD要切换到经典模式,不然菜单出不来。这个问题折磨了我一早上,最后邹同学远程才搞定。