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 hereAcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;// TODO: Add your initialization code herereturn (retCode) ;}virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {// TODO: Add your code here// You *must* call On_kUnloadAppMsg hereAcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;// TODO: Unload dependencies herereturn (retCode) ;}virtual void RegisterServerComponents () {}// - sk_ArxUseComCreateMenu.AdeskComMenu command (do not rename)static void sk_ArxUseComCreateMenuAdeskComMenu(void){// Add your code for command sk_ArxUseComCreateMenu.AdeskComMenu hereAutoCAD::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)

  

转载于:https://www.cnblogs.com/edata/p/10641987.html

ObjectARX动态添加AutoCAD传统下拉菜单入门篇(一)相关推荐

  1. jqurey ajax 的动态添加二级联动下拉菜单

    aspx <div id="Attribute"> 添加类型:<span class="oper"> <a href=" ...

  2. layui动态表格下拉菜单

    解决layui动态表格内插入下拉菜单简单方法 简单来讲就是在table.render里的done里获取该列表格创建select插入节点,再将res数据拼接上去.layuiselect模块加载进表格会被 ...

  3. Bootstrap 多级下拉菜单

    在很多时候,我们可能需要多级下拉菜单.在一个下拉菜单的某个菜单项中,再创建另一个下拉菜单,即可实现多级下拉菜单. 只需为下拉菜单的任意 <li> 元素添加 .dropdown-submen ...

  4. Bootstrap 下拉菜单和按钮

    一.下拉菜单: 用于显示链接列表的可切换.有上下文的菜单 .dropdown 菜单用于指定下拉菜单,下拉菜单都包裹在 .dropdown 或者 .dropup 里. .dropdown-menu 类用 ...

  5. bootstrap网格系统,下拉菜单

    网格系统实现原理 把网页大小分为12份,仅仅通过定义容器大小,平分12份,再调整内外边距,最后结合媒体查询,就可以制作出响应式栅格系统 栅格系统用于一系列的含(row)和列(column)的组合来创建 ...

  6. 1.2文字排版、颜色、表格、图像形状、Jumbotron、信息提示框、按钮、按钮组、徽章、加载效果、分页、列表组、卡片、下拉菜单、折叠

    Bootstrap 5 默认设置 Bootstrap 5 默认的 font-size 为 16px, line-height 为 1.5. 此外,所有的 <p> 元素 margin-top ...

  7. select 下拉菜单Option对象使用add(elements,index)方法动态添加

    2019独角兽企业重金招聘Python工程师标准>>> 原生js 的add函数为下拉菜单增加选项 1.object.add(oElement [, iIndex]) index 可选 ...

  8. html表单中动态添加下拉框,antd Select下拉菜单动态添加option里的内容操作

    antd Select下拉菜单动态添加option里的内容,通过form表单绑定select选中的值 提供一个公共的方法,每次只需去调用这个方法就行了 //这里是示例数据格式 let giftScop ...

  9. Android UI设计 下拉菜单Spinner用法 动态添加删除Spinner菜单项

    Spinner是一种下接菜单,类似HTML中的select标签,点击后弹出一个对话框,显示几个供选择的选项,手机屏幕大小有限,如果都用RadioGroup单选按钮,会占用很大的空间.今天的例子最终效果 ...

  10. 在Angular 8中使用自定义MultiSelect下拉菜单创建动态行

    目录 介绍 如何工作? 先决条件 使用代码 第1步 第2步 第3步 第4步 第5步 第6步 第7步 第8步 第9步 第10步 第11步 结论 介绍 在本文中,我们将学习如何使用Angular 8创建动 ...

最新文章

  1. 学习python之序言
  2. js-ES6学习笔记-module(2)
  3. python学习笔记9-函数1
  4. CF626E. Simple Skewness
  5. 上百个Android开源项目分享
  6. SpringCloud实战(二)Alibaba集成Ribbon实现负载均衡
  7. Spring整合MyBatis为什么导致MyBatis一级缓存失效
  8. 用eXeScope个性化自己的Win7
  9. 安装配置MySQL5.7详细教程
  10. 计算机不断自动重启,电脑一直自动重启,手把手教你电脑一直自动重启怎么解决...
  11. CNCC 2018参会回顾、总结
  12. 老服务器上安装windows server 2016
  13. Hybrid接口、MSTP协议
  14. baseservlet怎么写_BaseServlet
  15. JavaWeb - 软件开发的流程,综合案例
  16. Cocos-js快速上手
  17. Visual Studio 2010已安装,sql server 2008 management studio安装教程
  18. String和数据库类型的相互转化
  19. 计算机网络笔记---互联网的组成及三种交换方式
  20. activiti使用详解(一)

热门文章

  1. 华为USG6000V双机热备HRRP
  2. 乐高机器人投篮编程_乐高机器人WeDo编程和EV3编程课能学到什么
  3. JavaScript基础入门
  4. 二种方法js实现轮播图自动切换
  5. 随机前沿方法和数据包络分析
  6. 教你怎么利用Matlab画散点图
  7. Python 实现单词翻译
  8. 39、VS838红外线接收实验
  9. Mediastream2 用法介绍及简明实例分析
  10. hightopo学习之旅一 -- 节点动画