当我们要在CAD中创建自定菜单时,可以引用COM组件来实现。

下面是实现方式:

1、新建类库项目,并引用CAD目录(我这里用的是CAD2008)下的acdbmgd.dll、acmgd.dll,并将引用属性中的“复制本地”设为False。

2、添加Com引用:AutoCAD 2008 Type Library。

3、创建类“Main.cs”,并在类头部命名空间上加上修饰:

[assembly: CommandClass(typeof(AutoCAD_PopMenuTestCom.Main))]

  这样做是为了让CAD更空间找到我们的程序集。

4、以下是实现代码:

[CommandMethod("SMM")]
public void ShowMyMenu()
{
  //获取CAD应用程序
  AcadApplication app = (AcadApplication)Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication;
  for (int i = ; i < app.MenuGroups.Item().Menus.Count; i++)
  {
    if (app.MenuGroups.Item().Menus.Item(i).Name == "我的菜单Com") //判断菜单是否已存在,如果存在则不再创建
      return;
  }   AcadPopupMenu pmParnet = app.MenuGroups.Item().Menus.Add("我的菜单"); //添加根菜单   //多级
  AcadPopupMenu pm = pmParnet.AddSubMenu(pmParnet.Count + , "打开");
  AcadPopupMenuItem pmi0 = pm.AddMenuItem(pm.Count + , "文件 ", "OPEN1\n"); //第一个参数是在菜单项中的位置(第几项),第二个参数是显示的名称,第三个参数是点击之后执行的命令
  AcadPopupMenuItem pmi1 = pm.AddMenuItem(pm.Count + , "模版 ", "OPEN2\n");   //单级
  AcadPopupMenuItem pmi2 = pmParnet.AddMenuItem(pmParnet.Count + , "退出 ", "EXIT\n");   //将创建的菜单加入到CAD的菜单中
  pmParnet.InsertInMenuBar(app.MenuBar.Count + );
}

  将项目生成之后,启动CAD2008,输入命令:netload,然后找到我们生成的dll进行加载,加载完成之后,输入命令SMM,不出意外的话,就可以看到我们的菜单了(如果CAD提示找不到命令,可能是CAD出了问题,可以修复一下)。

  以下是运行后的效果:

  

  

  到了这里,也许你可以还有另一个要求:我不想每次都要输入命令才能加载菜单,我想让CAD启动时自动加载菜单。

  这个是很好实现的:

  1、写入注册表项

  我们的自定义程序集有一种启动方式是注册表启动,让CAD根据注册表信息去加载我们的程序集。

  在注册表项:LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD中记录了本机安装的CAD的信息,如下图:

  

  而展开RX.X项,下面的一级如果后缀是804表示的是中文版,409表示的是英文版:

  

  继续展开找到Applications项,我们要在Applications下面建一个属性我们自己的程序集的项,比如我这里建的是“MyMenuTestCom”。

  然后给我们新建的项添加四个值:

类型
DESCRIPTION REG_SZ(字符串) 简介说明
LOADCTRLS REG_DWORD(数字)

加载方式:

0x01:当代理对象被检测到时加载程序

0x02:当AutoCAD启动时加载程序

0x04:当输入命令时加载程序

0x08:当有用户或别的程序请求时加载程序

0x10:从不加载该应用程序

0x20:显式加载该应用程序

LOADER REG_SZ(字符串) dll路径
MANAGED REG_DWORD(数字) 是否是拖管程序集:1=是

  这样在CAD启动时就会自动加载我们的dll了,但是这还不够。

  2、实现IExtensionApplication接口

  CAD提供了一个IExtensionApplication接口,CAD在加载托管程序的时候,会调用实现了此接口的类进行初始化操作(在程序集被卸载时也会调用此类,即在CAD关闭时也会调用)。我们可以在这个类里调用我们创建菜单的方法,即可让我们的菜单在CAD启动时自动加载。

public class Init : IExtensionApplication
{
  #region IExtensionApplication 成员
  //在程序集初始化时
  public void Initialize()
  {
    //在程序集被初始化时,执行创建菜单操作,再配合注册表设置可以实现菜单的自动加载
    Main main = new Main();
    main.ShowMyMenu();
  }
  //在程序集被卸载时(也可以理解为CAD关闭时)
  public void Terminate()
  {   }   #endregion
}

  关闭IExtensionApplication更多的介绍可以看这里,但是对于该文章中提到的一点经过实践并不正确,也可能是意思并不明确:

  2.[assembly: ExtensionApplication(typeof(ManagedApp.Init))]

  上面表示ExtensionApplication属性,CAD首先查找它标志的类来初始化,如果没有找到,就找如上面public class Init :IExtensionApplication 实现了IExtensionApplication的类,如果还是没有找到,就跳过初始化。所以上面[assembly:ExtensionApplication(typeof(ManagedApp.Init))]和public class Init : IExtensionApplication后面的IExtensionApplication写上一处就可以了。

  经过实践证明,[assembly:ExtensionApplication(typeof(ManagedApp.Init))]可有可无,但是public class Init : IExtensionApplication后面的IExtensionApplication必须有。

  完整的测试代码下载:点击这里

AutoCAD.NET二次开发:创建自定义菜单(COM)的更多相关文章

  1. 微信公众号开发——创建自定义菜单(PHP版)

    <?php include "TokenUtil.php"; //TokenUtil::build_access_token(); $access_token = Token ...

  2. AutoCAD.NET二次开发:创建自定义菜单(AcCui)

    从CAD2007之后,Autodesk提供了一个新的程序集AcCui.dll,使用这个程序集,我们可以方便地做一些界面方面的操作,比如创建自定义菜单. 下面介绍一下菜单的创建过程: 1.在项目中添加引 ...

  3. .NET微信公众号开发-2.0创建自定义菜单

    一.前言 开发之前,我们需要阅读官方的接口说明文档,不得不吐槽一下,微信的这个官方文档真的很烂,但是,为了开发我们需要的功能,我们也不得不去看这些文档. 接口文档地址:http://mp.weixin ...

  4. .NET开发微信公众号之创建自定义菜单

    一.简介 微信公众平台服务号以及之前成功申请内测资格的订阅号都具有自定义菜单的功能.开发者可利用该功能为公众账号的会话界面底部增加自定义菜单,用户点击菜单中的选项,可以调出相应的回复信息或网页链接.自 ...

  5. 利用C#进行AUTOCAD的二次开发

    众所周知,对AutoCAD进行二次开发用到的主要工具有:ObjectArx,VBA,VLisp.但它们的优缺点是显而易见的:ObjectArx功能强大,编程效率高,但它的缺点是编程者必须掌握VC++, ...

  6. 2、Arx二次开发创建第一个应用程序

    一.本节课程 Arx二次开发创建第一个应用程序 二.本节要讲解的知识点 1.手动创建ARX的应用的步骤. 2.应用向导创建ARX应用程序的步骤. 三.具体内容 1.需求:创建一个Hello World ...

  7. PHPCMS V9二次开发便捷自定义后台入口文件夹

    phpcms v9二次开发便捷自定义后台入口文件夹 最新发布的phpcms v9由于采用了mvc的设计模式,所以它的后台访问地址是固定的,虽然可以通过修改路由配置文件来实现修改,但每次都修改路由配置文 ...

  8. 微信公众平台创建自定义菜单的PHP代码

    授人以鱼不如授人以渔.在方倍工作室上问了一下,创建自定义菜单的代码多少钱,一张口就一百,好吧,那我就给你们一人省一百块钱吧,你们说该如何谢谢我?事先说明一下啊,你的PHP版本要高于4.0.2才支持cU ...

  9. 4、c++ Arx二次开发创建多段线

    一.本节课程 c++ Arx二次开发创建多段线 二.本节要讲解的知识点 如何应用C++ ARX二次开发创建多段线(AcDbPolyline.AcDb2dPolyLine.AcDb3dPolyline的 ...

  10. 微信利用PHP创建自定义菜单的方法

    在使用通用接口前,你需要做以下两步工作:1.拥有一个微信公众账号,并获取到appid和appsecret(在公众平台申请内测资格,审核通过后可获得)2.通过获取凭证接口获取到access_token注 ...

随机推荐

  1. 如何使用UIAutomation进行iOS 自动化测试(Part I)

    转自:http://www.cnblogs.com/vowei/archive/2012/08/10/2631949.html 写在前面 研究iOS的自动化测试也有些日子了,刚开始的时候,一直苦于找不 ...

  2. ZOJ 3790 Consecutive Blocks (离散化 + 暴力)

    题目链接 虽然是一道暴力的题目,但是思路不好想.刚开始还超时,剪枝了以后1200ms,不知道为什么还是这么慢. 题意:给你n个点,每个点有一种颜色ci,给你至多k次删除操作,每次删除一个点,问最多k次 ...

  3. Android加速度传感器实现“摇一摇”,带手机振动

    由于代码有点多,所以就分开写了,注释还算详细,方便学习 Activity package com.lmw.android.test;   import android.app.Activity; im ...

  4. asp.net 2.0中新增的web.config的默认namespace功能 (转)

    看上去这个题目比较长,但实际上,我在看资料时发现,这就是说,在asp.net 2.0中,只需要在web.config里定义你要用的那些namespace,则在aspx页面中就不需要再象1.1那样,用 ...

  5. [反汇编练习] 160个CrackMe之018

    [反汇编练习] 160个CrackMe之018. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  6. 【ASP.NET MVC】"[A]System.Web.WebPages.Razor.Configuration.HostSection 无法强制转换为 ..."的解决办法

    1.错误页面: “/”应用程序中的服务器错误. [A]System.Web.WebPages.Razor.Configuration.HostSection 无法强制转换为 [B]System.Web ...

  7. 在Android应用中使用Clean架构

    自从开始开发安卓应用,我一直感觉我可以做得更好.我看过不少烂代码,其中当然有我写的.安卓系统的复杂性加上烂代码势必酿成灾祸,所以从错误中成长就很重要.我Google了如何更好地开发应用,发现了这个叫做 ...

  8. ecshop 二次开发及模板标签

    ecs_account_log // 用户账目日志表   ecs_activity // 活动表(代码,名称,开始,结束,描述)   ecs_ad // 广告表(位置,类型,名称,链接,图片,开始,结 ...

  9. ASP.NET服务器控件对应的HTML标签

    了解ASP.NET的控件最终解析成什么HTML代码,有助于我们对ASP.NET更深的了解,在使用JS交互时也知道如何操作. ASP.NET 服务器控件渲染到客户端之后对应的HTML标签讲解. labe ...

  10. HDU 5762 Teacher Bo

    Teacher Bo Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tota ...