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的
void
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接口
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Diagnostics;
usingSystem.Runtime.InteropServices;
usingAutodesk.AutoCAD.Interop;
usingAutodesk.AutoCAD.Interop.Common;
usingAutodesk.AutoCAD.ApplicationServices;
usingAutodesk.AutoCAD.Runtime;
namespaceCSharpCOM

{
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接口的
//Copyright2005-2007byAutodesk,Inc.
//
//Permissiontouse,copy,modify,anddistributethissoftwarein
//objectcodeformforanypurposeandwithoutfeeisherebygranted,
//providedthattheabovecopyrightnoticeappearsinallcopiesand
//thatboththatcopyrightnoticeandthelimitedwarrantyand
//restrictedrightsnoticebelowappearinallsupporting
//documentation.
//
//AUTODESKPROVIDESTHISPROGRAM"ASIS"ANDWITHALLFAULTS.
//AUTODESKSPECIFICALLYDISCLAIMSANYIMPLIEDWARRANTYOF
//MERCHANTABILITYORFITNESSFORAPARTICULARUSE.AUTODESK,INC.
using
本文介绍了如何使用不同的编程语言和技术来向AutoCAD中添加自定义菜单。包括通过C++使用AutoCAD COM接口、C++结合MFC技术、C#使用COM接口及C#通过ACUI.DLL接口的方法。
5270

被折叠的 条评论
为什么被折叠?



