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

在中望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要切换到经典模式,不然菜单出不来。这个问题折磨了我一早上,最后邹同学远程才搞定。

 

CAD(计算机辅助设计)的二次开发通常基于C语言。 CAD是一种通过计算机软件辅助进行设计和绘图的技术。它广泛应用于建筑、工程、制造和其他领域。CAD软件通常提供了基本的绘图和设计功能,但用户可能需要进行二次开发来满足特定的需求或定制功能。 C语言是一种高级编程语言,被广泛用于开发系统软件和应用软件。由于其灵活性和强大的编程功能,C语言成为CAD二次开发的理想选择。 通过C语言进行CAD二次开发,开发人员可以利用C语言的众多特性来编写高效、灵活和可靠的代码。C语言具有丰富的库函数和工具,能够轻松处理各种数据类型、算法和数据结构,这对于处理CAD中的复杂图形和数据非常重要。 借助C语言,开发人员可以轻松地通过调用CAD软件的API(应用程序接口)来进行二次开发。API是一组定义了CAD软件功能和操作的函数和工具,开发人员可以利用这些接口来扩展CAD的功能,添加自定义的工具和命令。 此外,使用C语言进行CAD二次开发还能够充分发挥C语言的跨平台特性。C语言的代码可以在各种操作系统和硬件平台上运行,这为CAD二次开发的灵活性和可移植性提供了很大的优势。 总之,CAD二次开发通常基于C语言,因为C语言提供了丰富的编程功能和跨平台能力,使开发人员能够编写高效、灵活和可靠的CAD应用程序。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值