void
addMenuThroughCom()
{
AutoCAD::IAcadApplication*pAcad;
AutoCAD::IAcadMenuBar*pMenuBar;
AutoCAD::IAcadMenuGroups*pMenuGroups;
AutoCAD::IAcadMenuGroup*pMenuGroup;
AutoCAD::IAcadPopupMenus*pPopUpMenus;
AutoCAD::IAcadPopupMenu*pPopUpMenu;
AutoCAD::IAcadPopupMenuItem*pPopUpMenuItem;
HRESULThr=NOERROR;
LPUNKNOWNpUnk=NULL;
LPDISPATCHpAcadDisp=acedGetIDispatch(TRUE);
if(pAcadDisp==NULL)
return;
hr=pAcadDisp->QueryInterface(AutoCAD::IID_IAcadApplication,(void**)&pAcad);
pAcadDisp->Release();
if(FAILED(hr))
return;
pAcad->put_Visible(true);
pAcad->get_MenuBar(&pMenuBar);
pAcad->get_MenuGroups(&pMenuGroups);
pAcad->Release();
longnumberOfMenus;
pMenuBar->get_Count(&numberOfMenus);
pMenuBar->Release();
VARIANTindex;
VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=0;
pMenuGroups->Item(index,&pMenuGroup);
pMenuGroups->Release();
pMenuGroup->get_Menus(&pPopUpMenus);
pMenuGroup->Release();
WCHARwstrMenuName[256];
#ifdefUNICODE
_tcscpy(wstrMenuName,L"AsdkComAccess");
#else//!UNICODE
MultiByteToWideChar(CP_ACP,0,"AsdkComAccess",-1,wstrMenuName,256);
#endif//!UNICODE
//Enablesthemenutobeloaded/unloadedwiththesamecommand.
if(!bIsMenuLoaded){
pPopUpMenus->Add(wstrMenuName,&pPopUpMenu);
if(pPopUpMenu!=NULL){
WCHARwstrMenuItemName[256];
WCHARwstrMenuItemMacro[256];
#ifdefUNICODE
_tcscpy(wstrMenuItemName,L"&AddAComCircle");
_tcscpy(wstrMenuItemMacro,L"AsdkComCircle");
#else//!UNICODE
MultiByteToWideChar(CP_ACP,0,"&AddAComCircle",-1,wstrMenuItemName,256);
MultiByteToWideChar(CP_ACP,0,"AsdkComCircle",-1,wstrMenuItemMacro,256);
#endif//!UNICODE
VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=0;
pPopUpMenu->AddMenuItem(index,wstrMenuItemName,wstrMenuItemMacro,&pPopUpMenuItem);
VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=1;
pPopUpMenu->AddSeparator(index,&pPopUpMenuItem);
#ifdefUNICODE
_tcscpy(wstrMenuItemName,L"Auto&LISPExample");
_tcscpy(wstrMenuItemMacro,L"(prin1\"Hello\")");
#else//!UNICODE
MultiByteToWideChar(CP_ACP,0,"Auto&LISPExample",-1,wstrMenuItemName,256);
MultiByteToWideChar(CP_ACP,0,"(prin1\"Hello\")",-1,wstrMenuItemMacro,256);
#endif//!UNICODE
VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=2;
pPopUpMenu->AddMenuItem(index,wstrMenuItemName,wstrMenuItemMacro,&pPopUpMenuItem);
VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=numberOfMenus-2;
pPopUpMenu->InsertInMenuBar(index);
pPopUpMenuItem->Release();
bIsMenuLoaded=true;
}else{
acutPrintf(_T("\nMenunotcreated."));
}
}else{
VariantInit(&index);
V_VT(&index)=VT_BSTR;
V_BSTR(&index)=wstrMenuName;
pPopUpMenus->RemoveMenuFromMenuBar(index);
VariantClear(&index);
bIsMenuLoaded=false;
}
pPopUpMenus->Release();
}
二 C++基于MFC的
addMenuThroughMfcCom()
{
TRY
{
CAcadApplicationIAcad(acedGetAcadWinApp()->GetIDispatch(TRUE));
CAcadMenuBarIMenuBar(IAcad.get_MenuBar());
longnumberOfMenus;
numberOfMenus=IMenuBar.get_Count();
CAcadMenuGroupsIMenuGroups(IAcad.get_MenuGroups());
VARIANTindex;
VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=0;
CAcadMenuGroupIMenuGroup(IMenuGroups.Item(index));
CAcadPopupMenusIPopUpMenus(IMenuGroup.get_Menus());
CStringcstrMenuName=_T("AsdkComAccess");
VariantInit(&index);
V_VT(&index)=VT_BSTR;
V_BSTR(&index)=cstrMenuName.AllocSysString();
IDispatch*pDisp=NULL;
//seeifthemenuisalreadythere
TRY{pDisp=IPopUpMenus.Item(index);pDisp->AddRef();}CATCH(COleDispatchException,e){}END_CATCH;
if(pDisp==NULL){
//createit
CAcadPopupMenuIPopUpMenu(IPopUpMenus.Add(cstrMenuName));
VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=0;
IPopUpMenu.AddMenuItem(index,_T("&AddAComCircle"),_T("_AsdkMfcComCircle"));
VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=1;
IPopUpMenu.AddSeparator(index);
VariantInit(&index);
V_VT(&index)=VT_I4;
V_I4(&index)=2;
IPopUpMenu.AddMenuItem(index,_T("Auto&LISPExample"),_T("(prin1\"Hello\")"));
pDisp=IPopUpMenu.m_lpDispatch;
pDisp->AddRef();
}
CAcadPopupMenuIPopUpMenu(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;
}
三 C#基于COM接口
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
using Autodesk.AutoCAD.Interop;
using Autodesk.AutoCAD.Interop.Common;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;
namespace CSharpCOM
{
publicclassClass1
{
publicClass1(){}
[CommandMethod("AM")]
publicstaticvoidAddMenuCom()
{
AcadApplicationapp=(AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.17");
AcadMenuBarmenuBar=app.MenuBar;
AcadMenuGroupmenuGroup=app.MenuGroups.Item(0);
AcadPopupMenusmenus=menuGroup.Menus;
AcadPopupMenumymenu=menus.Add("MyMenu");
mymenu.AddMenuItem(0,"Hello","hello");
mymenu.AddSeparator(1);
mymenu.AddMenuItem(2,"Hello2","hello");
AcadPopupMenuext=mymenu.AddSubMenu(3,"Ext");
ext.AddMenuItem(0,"Hello","hello");
ext.AddSeparator(1);
ext.AddMenuItem(2,"Hello2","hello");
mymenu.InsertInMenuBar(menuBar.Count-2);
}
[CommandMethod("hello")]
publicstaticvoidHello()
{
AcadApplicationapp=(AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.17");
app.ActiveDocument.Utility.Prompt("Hello\n");
}
}
}
四 CSharp基于ACUI.DLL接口的
//
// Permissiontouse,copy,modify,anddistributethissoftwarein
// objectcodeformforanypurposeandwithoutfeeisherebygranted,
// providedthattheabovecopyrightnoticeappearsinallcopiesand
// thatboththatcopyrightnoticeandthelimitedwarrantyand
// restrictedrightsnoticebelowappearinallsupporting
// documentation.
//
// AUTODESKPROVIDESTHISPROGRAM"ASIS"ANDWITHALLFAULTS.
// AUTODESKSPECIFICALLYDISCLAIMSANYIMPLIEDWARRANTYOF
// MERCHANTABILITYORFITNESSFORAPARTICULARUSE.AUTODESK,INC.
using