AddCADFrameMenu.h文件如下:
/**/
/*-------------------------------------------------------------------------
作者: Racky Ye
该类封装了在AuToCAD上添加菜单及子菜单的方法,使用COM接口实现
大家可以任意修改,添加新功能,希望大家能多交流
Email: yeguixi@126.com
--------------------------------------------------------------
使用方法:
CAddCADFrameMenu menu;
menu.AddMenu("我的菜单");
menu.AddSubMenu("弹出对话框", "_DLG ");
menu.AddSubMenu("绘制线条", "_DRAWL ");
menu.AddSubMenu("*Line");// 加"*"号表示是二级子菜单
menu.AddSubMenu("$CIRCLE", "_CIRCLE ");//加"$"号表示二级子菜单下的菜单条
menu.AddSubSeparator();
menu.AddSubMenu("$PLINE", "_PLINE ");//加"$"号表示二级子菜单下的菜单条
menu.AddSeparator();
menu.AddSubMenu("选择文件夹", "_SELFOLDER ");
menu.AddSubMenu("*TEXT");// 加"*"号表示是二级子菜单
menu.AddSubMenu("$MTEXT", "_TEXT ");//加"$"号表示二级子菜单下的菜单条
menu.CreateMenus();
--------------------------------------------------------------
----------------------------------------------------------------------------*/

#if
!defined(AFX_ADDCADFRAMEMENU_H__153847F5_DE2C_4B6E_83E8_5BE9FE780CD8__INCLUDED_)
#define
AFX_ADDCADFRAMEMENU_H__153847F5_DE2C_4B6E_83E8_5BE9FE780CD8__INCLUDED_

#if
_MSC_VER > 1000
#pragma
once
#endif
//
_MSC_VER > 1000

#include
<
afxtempl.h
>
#include
"
acad15.h
"


typedef
struct
CADMenu
...
{
char name[64];
char order[64];
}
CADMenu;

class
CAddCADFrameMenu 
...
{
public:
CAddCADFrameMenu();
virtual ~CAddCADFrameMenu();
// 创建菜单
void CreateMenus();
// 添加菜单
void AddMenu(const char* menuName);
// 添加子菜单,menuName-菜单名"--"为分隔符,command要加空格
void AddSubMenu(const char* menuName, const char* command=NULL);
// 添加分隔符
void AddSeparator();
// 添加二级子菜单分隔符
void AddSubSeparator();
static bool IsMenuExist(IAcadPopupMenu *&pMnu,long &index,const char *mnuname,IAcadPopupMenus *mnus);//菜单是否存在,避免二次加载 add by zhengzhilin
static bool GetAcadApplication(IAcadApplication *&pAcadApp);
static bool GetAcadMenuGroup(IAcadMenuGroup **pVal,LPCTSTR menuname);
static bool GetLastMenuFromMenubar(CString &sMenu);
static void ClearMenu(IAcadPopupMenus *mnus,LPCTSTR menuname);
static bool GetAcadApplication(LPDISPATCH * pVal);
static bool GetAcadMenuGroup(IAcadMenuGroup **pVal);
static void CleanUpMenus(); //创建了Menu一定要调用这个函数
private:
class CCADMenuArray : public CArray <CADMenu*, CADMenu*>
...{
public:
int AddMenu(CADMenu& menu);
int AddMenu(const char* menuName, const char* command);
~CCADMenuArray();
};
CArray <CCADMenuArray*, CCADMenuArray*> m_menus;
int m_menuCount; // 菜单个数
CStringArray m_TopMenuNames; // 菜单名

}
;
#endif
//
!defined(AFX_ADDCADFRAMEMENU_H__153847F5_DE2C_4B6E_83E8_5BE9FE780CD8__INCLUDED_)

AddCADFrameMenu.cpp文件如下:
/**/
/*-------------------------------------------------------------------------
作者:Racky Ye
该类封装了在AuToCAD上添加菜单及子菜单的方法,使用COM接口实现
大家可以任意修改,添加新功能,希望大家能多交流
Email: yeguixi@126.com
--------------------------------------------------------------*/

#include
"
stdafx.h
"
#include
"
resource.h
"
#include
"
AddCADFrameMenu.h
"
#include
"
acad15_i.c
"

#ifdef _DEBUG
#undef
THIS_FILE
static
char
THIS_FILE[]
=
__FILE__;
#define
new DEBUG_NEW
#endif

static
CStringArray stcMyTopMenuNames;
//
存储新添加的CAD顶级菜单项名称

/**/
//////////////////////////////////////////////////////////////////////
//
Construction/Destruction

/**/
//////////////////////////////////////////////////////////////////////
CAddCADFrameMenu::CAddCADFrameMenu()
...
{
m_menuCount = 0;
m_TopMenuNames.RemoveAll();
}

CAddCADFrameMenu::
~
CAddCADFrameMenu()
...
{
int num = m_menus.GetSize();
for (int i=0; i<num; i++) ...{
if (m_menus.GetAt(i) != NULL)
delete m_menus[i];
}
}

int
CAddCADFrameMenu::CCADMenuArray::AddMenu(CADMenu
&
menu)
...
{
CADMenu* pMenu = new CADMenu;
sprintf(pMenu->name, menu.name);
sprintf(pMenu

本文档介绍了如何通过COM接口在AutoCAD应用程序中创建自定义菜单。详细展示了AddCADFrameMenu.h和AddCADFrameMenu.cpp两个关键文件的内容,实现了命令和菜单项的添加功能。
6593

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



