如何在AutoCAD中加载自己的工具条
我在编程序时,要用到很多的非模态对话框,可是一不小心关掉就再也出不来了,因此我想在用AutoCAD加载程序时也加载一个工具条,只要点击一下工具条就可以出现我所需要的对话框,可是我编的程序编译,链接都可以,就是在AutoCAD中看不到我要的工具条,下面是我的做法,希望高手指点:1、用ARX向导建立一个USE MFC的程序框架。
2、在资源中创建一个工具条,ID为IDR_TOOLBAR_DEMO;
3、用“ObjectARX定义命令”对话框注册命令,在Internation栏填入CreateToolBar,然后点击编辑代码,并在XXXCommands.cpp中顶端加入#include"resource.h"
代码如下:
void jerryCreateToolBar()<BR>{<BR> if(!m_MyToolBar.CreateEx(NULL,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS<BR> |CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||!m_MyToolBar.LoadToolBar(IDR_TOOLBAR_DEMO))<BR> {<BR> TRACE0("Failed to create toolbar\n");<BR> return ;<BR> }<BR> m_MyToolBar.EnableDocking(CBRS_ALIGN_ANY);<BR>}
请问各位高手,我错在了哪里?我的功能应该如何实现? 我也想知道! <A href="http://www.cadhelp.net/bbs/dispbbs.asp?boardID=5&ID=393&page=1" target="_blank" >http://www.cadhelp.net/bbs/dispbbs.asp?boardID=5&ID=393&page=1</A>有答案 <P class=body>仔细看一下,稍微改一点你就可以用了.这些就在arx自带的帮助里!这要比你自己写好的多,我试过,直接拷过来就可以用!而且步骤也很清楚.
<P class=body>This method accesses AutoCAD ActiveX Automation through pure COM techniques. This method requires more coding, but does not rely on MFC. The sample program uses the COM ActiveX Automation interfaces to add a new shortcut menu to the AutoCAD menu bar. The following procedures demonstrate the necessary steps:
<UL><A name="" nid="2"></A>
<LI class=bullet_1_begin><A href="mk:@MSITStore:E:\文件\K030.arx.plus.all\docs\arxdev.chm::/arxdev256.html#394054" target="_blank" >To set up a new ObjectARX project </A></LI></UL>
<UL><A name="" nid="3"></A>
<LI class=bullet_1><A href="mk:@MSITStore:E:\文件\K030.arx.plus.all\docs\arxdev.chm::/arxdev256.html#393561" target="_blank" >To import AutoCAD ActiveX interfaces </A></LI></UL>
<UL><A name="" nid="4"></A>
<LI class=bullet_1_end><A href="mk:@MSITStore:E:\文件\K030.arx.plus.all\docs\arxdev.chm::/arxdev256.html#404195" target="_blank" >To implement AutoCAD ActiveX Automation calls </A></LI></UL><A name=394054 nid="5"></A>
<P class=list_intro>To set up a new ObjectARX project
<OL><A name="" nid="6"></A>
<LI class=list_1_reset value=1>Start Visual C++ and create a new Win32 Dynamic-Link Library project called AsdkComDocSamp. </LI></OL>
<OL><A name="" nid="7"></A>
<LI class=list_1 value=2>Add the appropriate values to the project settings to make the project build as an ObjectARX program. This program needs to link with the following libraries: </LI></OL><A name="" nid="8"></A><PRE class=prog_in_1>acad.lib</PRE><A name="" nid="9"></A><PRE class=prog_in_1>rxapi.lib</PRE><A name="" nid="10"></A><PRE class=prog_in_1>acrx15.lib</PRE><A name="" nid="11"></A><PRE class=prog_in_1>acutil15.lib</PRE><A name="" nid="12"></A><PRE class=prog_in_end_1>acedapi.lib</PRE>
<OL><A name="" nid="13"></A>
<LI class=list_1 value=3>Add a new definitions (DEF) file named <EM class=Emphasis>AsdkComDocSamp.def </EM>to the project. <A name="" nid="14"></A>
<LI class=list_1 value=4>Open the new DEF file, and add the following lines to the EXPORTS section: </LI></OL><A name="" nid="15"></A><PRE class=prog_in_1>acrxEntryPoint PRIVATE</PRE><A name="" nid="16"></A><PRE class=prog_in_end_1>acrxGetApiVersion PRIVATE</PRE>
<OL><A name="" nid="17"></A>
<LI class=list_1 value=5>Add a new source (CPP) file named <EM class=Emphasis>AsdkComDocSamp.cpp</EM> to the project. <A name="" nid="18"></A>
<LI class=list_1 value=6>Open the new CPP file, and add the following code to make the program ObjectARX compatible: </LI></OL><A name="" nid="19"></A><PRE class=prog_in_1>#include <rxregsvc.h></PRE><A name="" nid="20"></A><PRE class=prog_in_1>#include <aced.h></PRE><A name="" nid="21"></A><PRE class=prog_in_1></PRE><A name="" nid="22"></A><PRE class=prog_in_1>// Used to add/remove the menu with the same command.</PRE><A name="" nid="23"></A><PRE class=prog_in_1>//</PRE><A name="" nid="24"></A><PRE class=prog_in_1>static bool bIsMenuLoaded = false;</PRE><A name="" nid="25"></A><PRE class=prog_in_1></PRE><A name="" nid="26"></A><PRE class=prog_in_1>static void initApp()</PRE><A name="" nid="27"></A><PRE class=prog_in_1>{</PRE><A name="" nid="28"></A><PRE class=prog_in_1> acedRegCmds->addCommand(</PRE><A name="" nid="29"></A><PRE class=prog_in_1> "ASDK_PLAIN_COM", </PRE><A name="" nid="30"></A><PRE class=prog_in_1> "AsdkComMenu",</PRE><A name="" nid="31"></A><PRE class=prog_in_1> "ComMenu", </PRE><A name="" nid="32"></A><PRE class=prog_in_1> ACRX_CMD_MODAL, </PRE><A name="" nid="33"></A><PRE class=prog_in_1> addMenuThroughCom);</PRE><A name="" nid="34"></A><PRE class=prog_in_1>}</PRE><A name="" nid="35"></A><PRE class=prog_in_1></PRE><A name="" nid="36"></A><PRE class=prog_in_1>static void unloadApp()</PRE><A name="" nid="37"></A><PRE class=prog_in_1>{</PRE><A name="" nid="38"></A><PRE class=prog_in_1> acedRegCmds->removeGroup("ASDK_PLAIN_COM");</PRE><A name="" nid="39"></A><PRE class=prog_in_1>}</PRE><A name="" nid="40"></A><PRE class=prog_in_1></PRE><A name="" nid="41"></A><PRE class=prog_in_1>extern "C" AcRx::AppRetCode acrxEntryPoint</PRE><A name="" nid="42"></A><PRE class=prog_in_1> (AcRx::AppMsgCode msg, void* appId)</PRE><A name="" nid="43"></A><PRE class=prog_in_1>{</PRE><A name="" nid="44"></A><PRE class=prog_in_1> switch( msg ) </PRE><A name="" nid="45"></A><PRE class=prog_in_1> {</PRE><A name="" nid="46"></A><PRE class=prog_in_1> case AcRx::kInitAppMsg: </PRE><A name="" nid="47"></A><PRE class=prog_in_1> acrxDynamicLinker->unlockApplication(appId);</PRE><A name="" nid="48"></A><PRE class=prog_in_1> acrxDynamicLinker->registerAppMDIAware(appId);</PRE><A name="" nid="49"></A><PRE class=prog_in_1> initApp(); </PRE><A name="" nid="50"></A><PRE class=prog_in_1> break;</PRE><A name="" nid="51"></A><PRE class=prog_in_1> case AcRx::kUnloadAppMsg: </PRE><A name="" nid="52"></A><PRE class=prog_in_1> unloadApp(); </PRE><A name="" nid="53"></A><PRE class=prog_in_1> break;</PRE><A name="" nid="54"></A><PRE class=prog_in_1> default:</PRE><A name="" nid="55"></A><PRE class=prog_in_1> break;</PRE><A name="" nid="56"></A><PRE class=prog_in_1> }</PRE><A name="" nid="57"></A><PRE class=prog_in_1> return AcRx::kRetOK;</PRE><A name="" nid="58"></A><PRE class=prog_in_end_1>}</PRE>
<OL><A name="" nid="59"></A>
<LI class=list_1_end value=7>Stub in your new AutoCAD command handler function by adding the following code to the <EM class=Emphasis>AsdkComDocSamp.cpp</EM> source file: </LI></OL><A name="" nid="60"></A><PRE class=prog_in_1>void addMenuThroughCom()</PRE><A name="" nid="61"></A><PRE class=prog_in_1>{</PRE><A name="" nid="62"></A><PRE class=prog_in_end_1>}</PRE><A name="" nid="63"></A>
<P class=body>The next step is to decide which interfaces are necessary to access the AutoCAD menu bar. In this case, IAcadApplication, IAcadMenuBar, IAcadMenuGroups, IAcadMenuGroup, IAcadPopupMenus, IAcadPopupMenu, and IAcadPopupMenuItem are required. To get the definitions of these interfaces, use the AutoCAD type library (<EM class=Emphasis>acad.tlb</EM>) as shown in the next procedure.
<A name=393561 nid="64"></A>
<P class=list_intro>To import AutoCAD ActiveX interfaces
<OL><A name="" nid="65"></A>
<LI class=list_1_reset value=1>Add the following line to the top of the <EM class=Emphasis>AsdkComDocSamp.cpp</EM> file, making sure to use the path where AutoCAD is installed on your system: </LI></OL><A name="" nid="66"></A><PRE class=prog_in_1>import "c:\\acad\\acad.tlb" no_implementation \</PRE><A name="" nid="67"></A><PRE class=prog_in_end_1> raw_interfaces_only named_guids</PRE>
<OL><A name="" nid="68"></A>
<LI class=list_1_end value=2>Add the following declarations to the addMenuThroughCom() function: </LI></OL><A name="" nid="69"></A><PRE class=prog_in_1>AutoCAD::IAcadApplication *pAcad;</PRE><A name="" nid="70"></A><PRE class=prog_in_1>AutoCAD::IAcadMenuBar *pMenuBar;</PRE><A name="" nid="71"></A><PRE class=prog_in_1>AutoCAD::IAcadMenuGroups *pMenuGroups;</PRE><A name="" nid="72"></A><PRE class=prog_in_1>AutoCAD::IAcadMenuGroup *pMenuGroup;</PRE><A name="" nid="73"></A><PRE class=prog_in_1>AutoCAD::IAcadPopupMenus *pPopUpMenus;</PRE><A name="" nid="74"></A><PRE class=prog_in_1>AutoCAD::IAcadPopupMenu *pPopUpMenu;</PRE><A name="" nid="75"></A><PRE class=prog_in_end_1>AutoCAD::IAcadPopupMenuItem *pPopUpMenuItem;</PRE><A name="" nid="76"></A>
<P class=body>Now that your application imports the proper interfaces, you can use them to implement AutoCAD functionality. The more direct COM approach to Automation uses QueryInterface to access the IUnknown of AutoCAD and its Automation components. The next procedure shows how to accomplish this. All code examples in this procedure should be added to your addMenuThroughCOM() function in the sequence presented.
<A name=404195 nid="77"></A>
<P class=list_intro>To implement AutoCAD ActiveX Automation calls
<OL><A name="" nid="78"></A>
<LI class=list_1_reset value=1>In the <EM class=Emphasis>AsdkComDocSamp.cpp</EM> file, add the following code to the empty addMenuThroughCOM() function to get AutoCAD's IUnknown: </LI></OL><A name="" nid="79"></A><PRE class=prog_in_1>HRESULT hr = NOERROR;</PRE><A name="" nid="80"></A><PRE class=prog_in_1>CLSID clsid;</PRE><A name="" nid="81"></A><PRE class=prog_in_1>LPUNKNOWN pUnk = NULL;</PRE><A name="" nid="82"></A><PRE class=prog_in_1>LPDISPATCH pAcadDisp = NULL; </PRE><A name="" nid="83"></A><PRE class=prog_in_1>hr = ::CLSIDFromProgID(L"AutoCAD.Application",</PRE><A name="" nid="84"></A><PRE class=prog_in_1> &clsid);</PRE><A name="" nid="85"></A><PRE class=prog_in_1>if (FAILED(hr))</PRE><A name="" nid="86"></A><PRE class=prog_in_1> return;</PRE><A name="" nid="87"></A><PRE class=prog_in_1></PRE><A name="" nid="88"></A><PRE class=prog_in_1>if(::GetActiveObject(clsid, NULL, &pUnk) != S_OK)</PRE><A name="" nid="89"></A><PRE class=prog_in_1> return;</PRE><A name="" nid="90"></A><PRE class=prog_in_1></PRE><A name="" nid="91"></A><PRE class=prog_in_1>hr = pUnk->QueryInterface(IID_IDispatch, (LPVOID*) &pAcadDisp);</PRE><A name="" nid="92"></A><PRE class=prog_in_1>pUnk->Release();</PRE><A name="" nid="93"></A><PRE class=prog_in_1>if (FAILED(hr))</PRE><A name="" nid="94"></A><PRE class=prog_in_end_1> return;</PRE>
<OL><A name="" nid="95"></A>
<LI class=list_1 value=2>Use IUnknown to get the AutoCAD application object. Also, make sure AutoCAD is visible. This is shown in the following code: </LI></OL><A name="" nid="96"></A><PRE class=prog_in_1>hr = pAcadDisp->QueryInterface(AutoCAD::IID_IAcadApplication,</PRE><A name="" nid="97"></A><PRE class=prog_in_1> (void**)&pAcad);</PRE><A name="" nid="98"></A><PRE class=prog_in_1>pAcadDisp->Release();</PRE><A name="" nid="99"></A><PRE class=prog_in_1>if (FAILED(hr))</PRE><A name="" nid="100"></A><PRE class=prog_in_1> return;</PRE><A name="" nid="101"></A><PRE class=prog_in_end_1>pAcad->put_Visible(true);</PRE>
<OL><A name="" nid="102"></A>
<LI class=list_1 value=3>From the AutoCAD application interface, get the menu bar and menu groups collections: </LI></OL><A name="" nid="103"></A><PRE class=prog_in_1>pAcad->get_MenuBar(&pMenuBar);</PRE><A name="" nid="104"></A><PRE class=prog_in_1>pAcad->get_MenuGroups(&pMenuGroups);</PRE><A name="" nid="105"></A><PRE class=prog_in_end_1>pAcad->Release();</PRE>
<OL><A name="" nid="106"></A>
<LI class=list_1 value=4>Determine how many menus are current on the menu bar: </LI></OL><A name="" nid="107"></A><PRE class=prog_in_1>long numberOfMenus;</PRE><A name="" nid="108"></A><PRE class=prog_in_1>pMenuBar->get_Count(&numberOfMenus);</PRE><A name="" nid="109"></A><PRE class=prog_in_end_1>pMenuBar->Release();</PRE>
<OL><A name="" nid="110"></A>
<LI class=list_1 value=5>Get the first menu from the menu groups collection. This will normally be ACAD, but could be something else: </LI></OL><A name="" nid="111"></A><PRE class=prog_in_1>VARIANT index;</PRE><A name="" nid="112"></A><PRE class=prog_in_1>VariantInit(&index);</PRE><A name="" nid="113"></A><PRE class=prog_in_1>V_VT(&index) = VT_I4;</PRE><A name="" nid="114"></A><PRE class=prog_in_1>V_I4(&index) = 0;</PRE><A name="" nid="115"></A><PRE class=prog_in_1>pMenuGroups->Item(index, &pMenuGroup);</PRE><A name="" nid="116"></A><PRE class=prog_in_end_1>pMenuGroups->Release();</PRE>
<OL><A name="" nid="117"></A>
<LI class=list_1 value=6>Get the shortcut menus collection from the first menu group: </LI></OL><A name="" nid="118"></A><PRE class=prog_in_1>pMenuGroup->get_Menus(&pPopUpMenus);</PRE><A name="" nid="119"></A><PRE class=prog_in_end_1>pMenuGroup->Release();</PRE>
<OL><A name="" nid="120"></A>
<LI class=list_1_end value=7>Depending on whether the menu is already created, either construct a new shortcut menu or remove the previously created one. The following code completes the example: </LI></OL><A name="" nid="121"></A><PRE class=prog_in_1>WCHAR wstrMenuName;</PRE><A name="" nid="122"></A><PRE class=prog_in_1><FONT style="BACKGROUND-COLOR: #316ac5" color=#ffffff>MultiByteToWideChar</FONT>(CP_ACP, MB_PRECOMPOSED, </PRE><A name="" nid="123"></A><PRE class=prog_in_1> "AsdkComAccess", -1, wstrMenuName, 256); </PRE><A name="" nid="124"></A><PRE class=prog_in_1>if (!bIsMenuLoaded) {</PRE><A name="" nid="125"></A><PRE class=prog_in_1> pPopUpMenus->Add(wstrMenuName, &pPopUpMenu);</PRE><A name="" nid="126"></A><PRE class=prog_in_1> if (pPopUpMenu != NULL) {</PRE><A name="" nid="127"></A><PRE class=prog_in_1> pPopUpMenu->put_Name(wstrMenuName);</PRE><A name="" nid="128"></A><PRE class=prog_in_1> WCHAR wstrMenuItemName;</PRE><A name="" nid="129"></A><PRE class=prog_in_1> <FONT style="BACKGROUND-COLOR: #316ac5" color=#ffffff>MultiByteToWideChar</FONT>(CP_ACP, 0,"&Add A ComCircle",</PRE><A name="" nid="130"></A><PRE class=prog_in_1> -1, wstrMenuItemName, 256); </PRE><A name="" nid="131"></A><PRE class=prog_in_1> WCHAR wstrMenuItemMacro;</PRE><A name="" nid="132"></A><PRE class=prog_in_1> <FONT style="BACKGROUND-COLOR: #316ac5" color=#ffffff>MultiByteToWideChar</FONT>(CP_ACP, 0, "AsdkComCircle ",</PRE><A name="" nid="133"></A><PRE class=prog_in_1> -1, wstrMenuItemMacro, 256); </PRE><A name="" nid="134"></A><PRE class=prog_in_1> VariantInit(&index);</PRE><A name="" nid="135"></A><PRE class=prog_in_1> V_VT(&index) = VT_I4;</PRE><A name="" nid="136"></A><PRE class=prog_in_1> V_I4(&index) = 0;</PRE><A name="" nid="137"></A><PRE class=prog_in_1> pPopUpMenu->AddMenuItem(index, wstrMenuItemName,</PRE><A name="" nid="138"></A><PRE class=prog_in_1> wstrMenuItemMacro, &pPopUpMenuItem);</PRE><A name="" nid="139"></A><PRE class=prog_in_1> VariantInit(&index);</PRE><A name="" nid="140"></A><PRE class=prog_in_1> V_VT(&index) = VT_I4;</PRE><A name="" nid="141"></A><PRE class=prog_in_1> V_I4(&index) = 1;</PRE><A name="" nid="142"></A><PRE class=prog_in_1> pPopUpMenu->AddSeparator(index, </PRE><A name="" nid="143"></A><PRE class=prog_in_1> &pPopUpMenuItem);</PRE><A name="" nid="144"></A><PRE class=prog_in_1> <FONT style="BACKGROUND-COLOR: #316ac5" color=#ffffff>MultiByteToWideChar</FONT>(CP_ACP, 0,</PRE><A name="" nid="145"></A><PRE class=prog_in_1> "Auto&LISP Example", -1, </PRE><A name="" nid="146"></A><PRE class=prog_in_1> wstrMenuItemName, 256); </PRE><A name="" nid="147"></A><PRE class=prog_in_1> <FONT style="BACKGROUND-COLOR: #316ac5" color=#ffffff>MultiByteToWideChar</FONT>(CP_ACP, 0,</PRE><A name="" nid="148"></A><PRE class=prog_in_1> "(prin1 \"Hello\") ", -1, </PRE><A name="" nid="149"></A><PRE class=prog_in_1> wstrMenuItemMacro, 256); </PRE><A name="" nid="150"></A><PRE class=prog_in_1> VariantInit(&index);</PRE><A name="" nid="151"></A><PRE class=prog_in_1> V_VT(&index) = VT_I4;</PRE><A name="" nid="152"></A><PRE class=prog_in_1> V_I4(&index) = 2;</PRE><A name="" nid="153"></A><PRE class=prog_in_1> pPopUpMenu->AddMenuItem(index, wstrMenuItemName,</PRE><A name="" nid="154"></A><PRE class=prog_in_1> wstrMenuItemMacro, &pPopUpMenuItem);</PRE><A name="" nid="155"></A><PRE class=prog_in_1> VariantInit(&index);</PRE><A name="" nid="156"></A><PRE class=prog_in_1> V_VT(&index) = VT_I4;</PRE><A name="" nid="157"></A><PRE class=prog_in_1> V_I4(&index) = numberOfMenus - 2;</PRE><A name="" nid="158"></A><PRE class=prog_in_1> pPopUpMenu->InsertInMenuBar(index);</PRE><A name="" nid="159"></A><PRE class=prog_in_1> pPopUpMenu->Release();</PRE><A name="" nid="160"></A><PRE class=prog_in_1> pPopUpMenuItem->Release();</PRE><A name="" nid="161"></A><PRE class=prog_in_1> bIsMenuLoaded = true;</PRE><A name="" nid="162"></A><PRE class=prog_in_1> }else {</PRE><A name="" nid="163"></A><PRE class=prog_in_1> acutPrintf("\nMenu not created.");</PRE><A name="" nid="164"></A><PRE class=prog_in_1> }</PRE><A name="" nid="165"></A><PRE class=prog_in_1> }else {</PRE><A name="" nid="166"></A><PRE class=prog_in_1> VariantInit(&index);</PRE><A name="" nid="167"></A><PRE class=prog_in_1> V_VT(&index) = VT_BSTR;</PRE><A name="" nid="168"></A><PRE class=prog_in_1> V_BSTR(&index) = wstrMenuName;</PRE><A name="" nid="169"></A><PRE class=prog_in_1> pPopUpMenus->RemoveMenuFromMenuBar(index);</PRE><A name="" nid="170"></A><PRE class=prog_in_1> VariantClear(&index);</PRE><A name="" nid="171"></A><PRE class=prog_in_1> bIsMenuLoaded = false;</PRE><A name="" nid="172"></A><PRE class=prog_in_1>}</PRE><A name="" nid="173"></A><PRE class=prog_in_end_1>pPopUpMenus->Release();</PRE><A name="" nid="174"></A>
<P class=body>Here is the finished function:
<A name="" nid="175"></A><PRE class=prog_in_0>void</PRE><A name="" nid="176"></A><PRE class=prog_in_0>addMenuThroughCom()</PRE><A name="" nid="177"></A><PRE class=prog_in_0>{</PRE><A name="" nid="178"></A><PRE class=prog_in_0> AutoCAD::IAcadApplication *pAcad;</PRE><A name="" nid="179"></A><PRE class=prog_in_0> AutoCAD::IAcadMenuBar *pMenuBar;</PRE><A name="" nid="180"></A><PRE class=prog_in_0> AutoCAD::IAcadMenuGroups *pMenuGroups;</PRE><A name="" nid="181"></A><PRE class=prog_in_0> AutoCAD::IAcadMenuGroup *pMenuGroup;</PRE><A name="" nid="182"></A><PRE class=prog_in_0> AutoCAD::IAcadPopupMenus *pPopUpMenus;</PRE><A name="" nid="183"></A><PRE class=prog_in_0> AutoCAD::IAcadPopupMenu *pPopUpMenu;</PRE><A name="" nid="184"></A><PRE class=prog_in_0> AutoCAD::IAcadPopupMenuItem *pPopUpMenuItem;</PRE><A name="" nid="185"></A><PRE class=prog_in_0> HRESULT hr = NOERROR;</PRE><A name="" nid="186"></A><PRE class=prog_in_0> CLSID clsid;</PRE><A name="" nid="187"></A><PRE class=prog_in_0> LPUNKNOWN pUnk = NULL;</PRE><A name="" nid="188"></A><PRE class=prog_in_0> LPDISPATCH pAcadDisp = NULL; </PRE><A name="" nid="189"></A><PRE class=prog_in_0></PRE><A name="" nid="190"></A><PRE class=prog_in_0> hr = ::CLSIDFromProgID(L"AutoCAD.Application",</PRE><A name="" nid="191"></A><PRE class=prog_in_0> &clsid);</PRE><A name="" nid="192"></A><PRE class=prog_in_0> if (FAILED(hr))</PRE><A name="" nid="193"></A><PRE class=prog_in_0> return;</PRE><A name="" nid="194"></A><PRE class=prog_in_0> if(::GetActiveObject(clsid, NULL, &pUnk) != S_OK)</PRE><A name="" nid="195"></A><PRE class=prog_in_0> return;</PRE><A name="" nid="196"></A><PRE class=prog_in_0></PRE><A name="" nid="197"></A><PRE class=prog_in_0> hr = pUnk->QueryInterface(IID_IDispatch, (LPVOID*) &pAcadDisp);</PRE><A name="" nid="198"></A><PRE class=prog_in_0> pUnk->Release();</PRE><A name="" nid="199"></A><PRE class=prog_in_0> if (FAILED(hr))</PRE><A name="" nid="200"></A><PRE class=prog_in_0> return;</PRE><A name="" nid="201"></A><PRE class=prog_in_0></PRE><A name="" nid="202"></A><PRE class=prog_in_0> hr = pAcadDisp->QueryInterface(AutoCAD::IID_IAcadApplication, (void**)&pAcad);</PRE><A name="" nid="203"></A><PRE class=prog_in_0> pAcadDisp->Release();</PRE><A name="" nid="204"></A><PRE class=prog_in_0> if (FAILED(hr))</PRE><A name="" nid="205"></A><PRE class=prog_in_0> return;</PRE><A name="" nid="206"></A><PRE class=prog_in_0></PRE><A name="" nid="207"></A><PRE class=prog_in_0> pAcad->put_Visible(true);</PRE><A name="" nid="208"></A><PRE class=prog_in_0> pAcad->get_MenuBar(&pMenuBar);</PRE><A name="" nid="209"></A><PRE class=prog_in_0> pAcad->get_MenuGroups(&pMenuGroups);</PRE><A name="" nid="210"></A><PRE class=prog_in_0> pAcad->Release();</PRE><A name="" nid="211"></A><PRE class=prog_in_0> long numberOfMenus;</PRE><A name="" nid="212"></A><PRE class=prog_in_0> pMenuBar->get_Count(&numberOfMenus);</PRE><A name="" nid="213"></A><PRE class=prog_in_0> pMenuBar->Release();</PRE><A name="" nid="214"></A><PRE class=prog_in_0> VARIANT index;</PRE><A name="" nid="215"></A><PRE class=prog_in_0> VariantInit(&index);</PRE><A name="" nid="216"></A><PRE class=prog_in_0> V_VT(&index) = VT_I4;</PRE><A name="" nid="217"></A><PRE class=prog_in_0> V_I4(&index) = 0;</PRE><A name="" nid="218"></A><PRE class=prog_in_0> pMenuGroups->Item(index, &pMenuGroup);</PRE><A name="" nid="219"></A><PRE class=prog_in_0> pMenuGroups->Release();</PRE><A name="" nid="220"></A><PRE class=prog_in_0></PRE><A name="" nid="221"></A><PRE class=prog_in_0> pMenuGroup->get_Menus(&pPopUpMenus);</PRE><A name="" nid="222"></A><PRE class=prog_in_0> pMenuGroup->Release();</PRE><A name="" nid="223"></A><PRE class=prog_in_0> WCHAR wstrMenuName;</PRE><A name="" nid="224"></A><PRE class=prog_in_0> <FONT style="BACKGROUND-COLOR: #316ac5" color=#ffffff>MultiByteToWideChar</FONT>(CP_ACP, MB_PRECOMPOSED, </PRE><A name="" nid="225"></A><PRE class=prog_in_0> "AsdkComAccess", -1, wstrMenuName, 256); </PRE><A name="" nid="226"></A><PRE class=prog_in_0> if (!bIsMenuLoaded) {</PRE><A name="" nid="227"></A><PRE class=prog_in_0> pPopUpMenus->Add(wstrMenuName, &pPopUpMenu);</PRE><A name="" nid="228"></A><PRE class=prog_in_0> if (pPopUpMenu != NULL) {</PRE><A name="" nid="229"></A><PRE class=prog_in_0> pPopUpMenu->put_Name(wstrMenuName);</PRE><A name="" nid="230"></A><PRE class=prog_in_0> WCHAR wstrMenuItemName;</PRE><A name="" nid="231"></A><PRE class=prog_in_0> <FONT style="BACKGROUND-COLOR: #316ac5" color=#ffffff>MultiByteToWideChar</FONT>(CP_ACP, 0,"&Add A ComCircle",</PRE><A name="" nid="232"></A><PRE class=prog_in_0> -1, wstrMenuItemName, 256); </PRE><A name="" nid="233"></A><PRE class=prog_in_0> WCHAR wstrMenuItemMacro;</PRE><A name="" nid="234"></A><PRE class=prog_in_0> <FONT style="BACKGROUND-COLOR: #316ac5" color=#ffffff>MultiByteToWideChar</FONT>(CP_ACP, 0, "AsdkComCircle ",</PRE><A name="" nid="235"></A><PRE class=prog_in_0> -1, wstrMenuItemMacro, 256); </PRE><A name="" nid="236"></A><PRE class=prog_in_0> VariantInit(&index);</PRE><A name="" nid="237"></A><PRE class=prog_in_0> V_VT(&index) = VT_I4;</PRE><A name="" nid="238"></A><PRE class=prog_in_0> V_I4(&index) = 0;</PRE><A name="" nid="239"></A><PRE class=prog_in_0> pPopUpMenu->AddMenuItem(index, wstrMenuItemName,</PRE><A name="" nid="240"></A><PRE class=prog_in_0> wstrMenuItemMacro, &pPopUpMenuItem);</PRE><A name="" nid="241"></A><PRE class=prog_in_0> VariantInit(&index);</PRE><A name="" nid="242"></A><PRE class=prog_in_0> V_VT(&index) = VT_I4;</PRE><A name="" nid="243"></A><PRE class=prog_in_0> V_I4(&index) = 1;</PRE><A name="" nid="244"></A><PRE class=prog_in_0> pPopUpMenu->AddSeparator(index, </PRE><A name="" nid="245"></A><PRE class=prog_in_0> &pPopUpMenuItem);</PRE><A name="" nid="246"></A><PRE class=prog_in_0> <FONT style="BACKGROUND-COLOR: #316ac5" color=#ffffff>MultiByteToWideChar</FONT>(CP_ACP, 0,</PRE><A name="" nid="247"></A><PRE class=prog_in_0> "Auto&LISP Example", -1, </PRE><A name="" nid="248"></A><PRE class=prog_in_0> wstrMenuItemName, 256); </PRE><A name="" nid="249"></A><PRE class=prog_in_0> <FONT style="BACKGROUND-COLOR: #316ac5" color=#ffffff>MultiByteToWideChar</FONT>(CP_ACP, 0,</PRE><A name="" nid="250"></A><PRE class=prog_in_0> "(prin1 \"Hello\") ", -1, </PRE><A name="" nid="251"></A><PRE class=prog_in_0> wstrMenuItemMacro, 256); </PRE><A name="" nid="252"></A><PRE class=prog_in_0> VariantInit(&index);</PRE><A name="" nid="253"></A><PRE class=prog_in_0> V_VT(&index) = VT_I4;</PRE><A name="" nid="254"></A><PRE class=prog_in_0> V_I4(&index) = 2;</PRE><A name="" nid="255"></A><PRE class=prog_in_0> pPopUpMenu->AddMenuItem(index, wstrMenuItemName,</PRE><A name="" nid="256"></A><PRE class=prog_in_0> wstrMenuItemMacro, &pPopUpMenuItem);</PRE><A name="" nid="257"></A><PRE class=prog_in_0> VariantInit(&index);</PRE><A name="" nid="258"></A><PRE class=prog_in_0> V_VT(&index) = VT_I4;</PRE><A name="" nid="259"></A><PRE class=prog_in_0> V_I4(&index) = numberOfMenus - 2;;</PRE><A name="" nid="260"></A><PRE class=prog_in_0> pPopUpMenu->InsertInMenuBar(index);</PRE><A name="" nid="261"></A><PRE class=prog_in_0> pPopUpMenu->Release();</PRE><A name="" nid="262"></A><PRE class=prog_in_0> pPopUpMenuItem->Release();</PRE><A name="" nid="263"></A><PRE class=prog_in_0> </PRE><A name="" nid="264"></A><PRE class=prog_in_0> bIsMenuLoaded = true;</PRE><A name="" nid="265"></A><PRE class=prog_in_0> } else {</PRE><A name="" nid="266"></A><PRE class=prog_in_0> acutPrintf("\nMenu not created.");</PRE><A name="" nid="267"></A><PRE class=prog_in_0> }</PRE><A name="" nid="268"></A><PRE class=prog_in_0> } else {</PRE><A name="" nid="269"></A><PRE class=prog_in_0> VariantInit(&index);</PRE><A name="" nid="270"></A><PRE class=prog_in_0> V_VT(&index) = VT_BSTR;</PRE><A name="" nid="271"></A><PRE class=prog_in_0> V_BSTR(&index) = wstrMenuName;</PRE><A name="" nid="272"></A><PRE class=prog_in_0> pPopUpMenus->RemoveMenuFromMenuBar(index);</PRE><A name="" nid="273"></A><PRE class=prog_in_0> VariantClear(&index);</PRE><A name="" nid="274"></A><PRE class=prog_in_0> bIsMenuLoaded = false;</PRE><A name="" nid="275"></A><PRE class=prog_in_0> }</PRE><A name="" nid="276"></A><PRE class=prog_in_0> pPopUpMenus->Release();</PRE><A name="" nid="277"></A><PRE class=prog_in_0> </PRE><A name="" nid="278"></A><PRE class=prog_in_end_0>}</PRE><A name="" nid="279"></A>
<P class=body>Both of these examples can be found in the ObjectARX SDK. They are located in the <EM class=Emphasis>docsamps\comsamps</EM> directory. Each sample contains code for adding a circle and a menu using either Win32 API or MFC programming techniques. Because these methods access AutoCAD through COM interfaces, these programming techniques can be used from other C++ contexts--not just from ObjectARX. Similar techniques can also be used in other languages, such as Visual Basic.
页:
[1]