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 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传统下拉菜单入门篇(一)相关推荐
- jqurey ajax 的动态添加二级联动下拉菜单
aspx <div id="Attribute"> 添加类型:<span class="oper"> <a href=" ...
- layui动态表格下拉菜单
解决layui动态表格内插入下拉菜单简单方法 简单来讲就是在table.render里的done里获取该列表格创建select插入节点,再将res数据拼接上去.layuiselect模块加载进表格会被 ...
- Bootstrap 多级下拉菜单
在很多时候,我们可能需要多级下拉菜单.在一个下拉菜单的某个菜单项中,再创建另一个下拉菜单,即可实现多级下拉菜单. 只需为下拉菜单的任意 <li> 元素添加 .dropdown-submen ...
- Bootstrap 下拉菜单和按钮
一.下拉菜单: 用于显示链接列表的可切换.有上下文的菜单 .dropdown 菜单用于指定下拉菜单,下拉菜单都包裹在 .dropdown 或者 .dropup 里. .dropdown-menu 类用 ...
- bootstrap网格系统,下拉菜单
网格系统实现原理 把网页大小分为12份,仅仅通过定义容器大小,平分12份,再调整内外边距,最后结合媒体查询,就可以制作出响应式栅格系统 栅格系统用于一系列的含(row)和列(column)的组合来创建 ...
- 1.2文字排版、颜色、表格、图像形状、Jumbotron、信息提示框、按钮、按钮组、徽章、加载效果、分页、列表组、卡片、下拉菜单、折叠
Bootstrap 5 默认设置 Bootstrap 5 默认的 font-size 为 16px, line-height 为 1.5. 此外,所有的 <p> 元素 margin-top ...
- select 下拉菜单Option对象使用add(elements,index)方法动态添加
2019独角兽企业重金招聘Python工程师标准>>> 原生js 的add函数为下拉菜单增加选项 1.object.add(oElement [, iIndex]) index 可选 ...
- html表单中动态添加下拉框,antd Select下拉菜单动态添加option里的内容操作
antd Select下拉菜单动态添加option里的内容,通过form表单绑定select选中的值 提供一个公共的方法,每次只需去调用这个方法就行了 //这里是示例数据格式 let giftScop ...
- Android UI设计 下拉菜单Spinner用法 动态添加删除Spinner菜单项
Spinner是一种下接菜单,类似HTML中的select标签,点击后弹出一个对话框,显示几个供选择的选项,手机屏幕大小有限,如果都用RadioGroup单选按钮,会占用很大的空间.今天的例子最终效果 ...
- 在Angular 8中使用自定义MultiSelect下拉菜单创建动态行
目录 介绍 如何工作? 先决条件 使用代码 第1步 第2步 第3步 第4步 第5步 第6步 第7步 第8步 第9步 第10步 第11步 结论 介绍 在本文中,我们将学习如何使用Angular 8创建动 ...
最新文章
- 学习python之序言
- js-ES6学习笔记-module(2)
- python学习笔记9-函数1
- CF626E. Simple Skewness
- 上百个Android开源项目分享
- SpringCloud实战(二)Alibaba集成Ribbon实现负载均衡
- Spring整合MyBatis为什么导致MyBatis一级缓存失效
- 用eXeScope个性化自己的Win7
- 安装配置MySQL5.7详细教程
- 计算机不断自动重启,电脑一直自动重启,手把手教你电脑一直自动重启怎么解决...
- CNCC 2018参会回顾、总结
- 老服务器上安装windows server 2016
- Hybrid接口、MSTP协议
- baseservlet怎么写_BaseServlet
- JavaWeb - 软件开发的流程,综合案例
- Cocos-js快速上手
- Visual Studio 2010已安装,sql server 2008 management studio安装教程
- String和数据库类型的相互转化
- 计算机网络笔记---互联网的组成及三种交换方式
- activiti使用详解(一)