• 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("
    Menu 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)
    

      

  • 相关阅读:
    c++——类 继承
    Pytorch Tensor, Variable, 自动求导
    Python-OpenCV实现二值图像孔洞填充
    神经网络手写数字识别numpy实现
    神经网络反向传播公式推导
    转:Markdown语法大全
    markdown居中对齐,左对齐,右对齐
    硬编码与软编码
    转:Markdown数学公式语法
    Python if __name__=='__main__'
  • 原文地址:https://www.cnblogs.com/edata/p/10641987.html
Copyright © 2020-2023  润新知