中望CAD二次开发自定义菜单(C++)

在中望CAD中添加自定义菜单,一步一步来:

1.新建zrxobject项目,我命名为menuTest2。

2.引入菜单所需要的头文件,这一步很重要。我也是刚开始接触,查了很久,找到的代码都无法使用。后来在同事的帮助下搞定了,在此特别感谢邹建同学。记一下,分享给大家,也留个记录。

(1)右键单击项目,找到属性.

中望CAD二次开发自定义菜单(C++)_第1张图片

(2)点击打开属性,找到VC++目录,在包含目录和引用目录中加入中望CAD的安装目录,中望SDK目录下的inc文件夹以及目录下的lib-64文件夹,确定。

中望CAD二次开发自定义菜单(C++)_第2张图片

(3)在菜单栏上找到项目,添加类->MFC->TypeLib中的MFC类,点击添加。

中望CAD二次开发自定义菜单(C++)_第3张图片

(4)在打开的对话框中->可用的类型库,点击下拉列表,找到红箭头所指(最下面了哈),

中望CAD二次开发自定义菜单(C++)_第4张图片

从接口中选择和menu有关的接口,点红圈所示的地方,在右边就会看到相应的生成类,依次添加就好。点击完成

 

中望CAD二次开发自定义菜单(C++)_第5张图片

至此,准备工作就做完了。现在加代码,完整代码如下,读者可自行修改和添加。



#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的位。

中望CAD二次开发自定义菜单(C++)_第6张图片

找到menutest2.zrx。在中望CAD中加载,命令行输入DLGSAMPLE,ok,菜单出来了。注意:中望CAD要切换到经典模式,不然菜单出不来。这个问题折磨了我一早上,最后邹同学远程才搞定。

 

中望CAD二次开发自定义菜单(C++)_第7张图片

你可能感兴趣的:(中望CAD二次开发,中望CAD二次开发,自定义菜单,C++)