ObjectARX动态添加AutoCAD传统下拉菜单入门篇(一)
ObjectARX动态添加传统下拉菜单入门篇 图文by edata , 转载注明出处 http://www.cnblogs.com/edata
AutoCAD 添加传统下拉菜单有很多种方式,比较典型的就是制作菜单文件mnu文本,加载(下拉菜单有的可能需要写弹出代码才能添加到菜单栏才能显示,工具条加载就能显示)。
还有另外一种方式就是使用com接口来动态添加,而com接口的使用在objectARX编程中主要有两种应用方式,代码编写不同。
下面介绍的就是com接口的第二种方式,使用#import导入tlb类型库,这种方式不用加入额外的cpp文件。
以下参考arxdev.chm的相关章节完成 ,编程测试环境,vs2010+vs2008,AutoCAD2011。
图文开始:












此处的波浪线也是因为vs还未导入tlb类型库,编译后会将tlb导出一个tlh文件,就不会提示波浪线了










后记:com虽然可以动态添加菜单,但是现在的CAD菜单都是带有图标的,貌似这种动态不能实现。
篇幅有限,仅仅概述了com动态加载菜单的一种方式,该代码还有一些问题,如有机会,再详细介绍。
附源码一份
// (C) Copyright 2002-2007 by Autodesk, Inc.
//
// Permission to use, copy, modify, and distribute this software in
// object code form for any purpose and without fee is hereby granted,
// provided that the above copyright notice appears in all copies and
// that both that copyright notice and the limited warranty and
// restricted rights notice below appear in all supporting
// documentation.
//
// AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC.
// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
// UNINTERRUPTED OR ERROR FREE.
//
// Use, duplication, or disclosure by the U.S. Government is subject to
// restrictions set forth in FAR 52.227-19 (Commercial Computer
// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
// (Rights in Technical Data and Computer Software), as applicable.
//
//-----------------------------------------------------------------------------
//----- acrxEntryPoint.cpp
//-----------------------------------------------------------------------------
#include "StdAfx.h"
#include "resource.h"
//-----------------------------------------------------------------------------
#define szRDS _RXST("sk_")
static bool bIsMenuLoaded = false;
#import "acax18ENU.tlb" no_implementation raw_interfaces_only named_guids
//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class CArxUseComCreateMenuApp : public AcRxArxApp {
public:
CArxUseComCreateMenuApp () : AcRxArxApp () {}
virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
// TODO: Load dependencies here
// You *must* call On_kInitAppMsg here
AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
// TODO: Add your initialization code here
return (retCode) ;
}
virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
// TODO: Add your code here
// You *must* call On_kUnloadAppMsg here
AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
// TODO: Unload dependencies here
return (retCode) ;
}
virtual void RegisterServerComponents () {
}
// - sk_ArxUseComCreateMenu.AdeskComMenu command (do not rename)
static void sk_ArxUseComCreateMenuAdeskComMenu(void)
{
// Add your code for command sk_ArxUseComCreateMenu.AdeskComMenu here
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);
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];
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, "AsdkComAccess", -1, wstrMenuName, 256);
if (!bIsMenuLoaded)
{
pPopUpMenus->Add(wstrMenuName, &pPopUpMenu);
if (pPopUpMenu != NULL)
{
pPopUpMenu->put_Name(wstrMenuName);
WCHAR wstrMenuItemName[256];
MultiByteToWideChar(CP_ACP, 0,"&Add A ComCircle",-1, wstrMenuItemName, 256);
WCHAR wstrMenuItemMacro[256];
MultiByteToWideChar(CP_ACP, 0, "AsdkComCircle ",-1, wstrMenuItemMacro, 256);
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);
MultiByteToWideChar(CP_ACP, 0,"Auto&LISP Example", -1,wstrMenuItemName, 256);
MultiByteToWideChar(CP_ACP, 0,"(prin1 \"Hello\") ", -1,wstrMenuItemMacro, 256);
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);
pPopUpMenu->Release();
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();
}
} ;
//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CArxUseComCreateMenuApp)
ACED_ARXCOMMAND_ENTRY_AUTO(CArxUseComCreateMenuApp, sk_ArxUseComCreateMenu, AdeskComMenu, ComMenu, ACRX_CMD_TRANSPARENT, NULL)

浙公网安备 33010602011771号