void
addMenuThroughCom()
{
AutoCAD::IAcadApplication *pAcad;
AutoCAD::IAcadMenuBar *pMenuBar;
AutoCAD::IAcadMenuGroups *pMenuGroups;
AutoCAD::IAcadMenuGroup *pMenuGroup;
AutoCAD::IAcadPopupMenus *pPopUpMenus;
AutoCAD::IAcadPopupMenu *pPopUpMenu;
AutoCAD::IAcadPopupMenuItem *pPopUpMenuItem;
HRESULT hr = NOERROR;
LPUNKNOWN pUnk = NULL;
LPDISPATCH pAcadDisp = 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();
long numberOfMenus;
pMenuBar->get_Count(&numberOfMenus);
pMenuBar->Release();
VARIANT index;
VariantInit(&index);
V_VT(&index) = VT_I4;
V_I4(&index) = 0;
pMenuGroups->Item(index, &pMenuGroup);
pMenuGroups->Release();
pMenuGroup->get_Menus(&pPopUpMenus);
pMenuGroup->Release();
WCHAR wstrMenuName[256];
#ifdef UNICODE
_tcscpy(wstrMenuName, L"AsdkComAccess");
#else // !UNICODE
MultiByteToWideChar(CP_ACP, 0, "AsdkComAccess", -1, wstrMenuName, 256);
#endif // !UNICODE
// Enables the menu to be loaded/unloaded with the same command.
if (!bIsMenuLoaded) {
pPopUpMenus->Add(wstrMenuName, &pPopUpMenu);
if (pPopUpMenu != NULL) {
WCHAR wstrMenuItemName[256];
WCHAR wstrMenuItemMacro[256];
#ifdef UNICODE
_tcscpy(wstrMenuItemName, L"&Add A ComCircle");
_tcscpy(wstrMenuItemMacro, L"AsdkComCircle ");
#else // !UNICODE
MultiByteToWideChar(CP_ACP, 0, "&Add A ComCircle", -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);
#ifdef UNICODE
_tcscpy(wstrMenuItemName, L"Auto&LISP Example");
_tcscpy(wstrMenuItemMacro, L"(prin1 /"Hello/") ");
#else // !UNICODE
MultiByteToWideChar(CP_ACP, 0, "Auto&LISP Example", -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("/nMenu not created."));
}
} 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
{
CAcadApplication IAcad(acedGetAcadWinApp()->GetIDispatch(TRUE));
CAcadMenuBar IMenuBar(IAcad.get_MenuBar());
long numberOfMenus;
numberOfMenus = IMenuBar.get_Count();
CAcadMenuGroups IMenuGroups(IAcad.get_MenuGroups());
VARIANT index;
VariantInit(&index);
V_VT(&index) = VT_I4;
V_I4(&index) = 0;
CAcadMenuGroup IMenuGroup(IMenuGroups.Item(index));
CAcadPopupMenus IPopUpMenus(IMenuGroup.get_Menus());
CString cstrMenuName = _T("AsdkComAccess");
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;
if (pDisp==NULL) {
//create it
CAcadPopupMenu IPopUpMenu(IPopUpMenus.Add(cstrMenuName));
VariantInit(&index);
V_VT(&index) = VT_I4;
V_I4(&index) = 0;
IPopUpMenu.AddMenuItem(index, _T("&Add A ComCircle"), _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&LISP Example"), _T("(prin1 /"Hello/") "));
pDisp = IPopUpMenu.m_lpDispatch;
pDisp->AddRef();
}
CAcadPopupMenu 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;
}
三 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
{
public class Class1
{
public Class1() { }
[CommandMethod("AM")]
public static void AddMenuCom()
{
AcadApplication app = (AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.17");
AcadMenuBar menuBar = app.MenuBar;
AcadMenuGroup menuGroup = app.Me