06822008 发表于 2008-2-29 10:51:00

ObkectARX为cad添加新的菜单

<p>请教各位怎样使用objectARX为cad添加新的菜单和菜单项。</p><p>相关的代码怎么写啊</p><p>谢谢!</p><p></p>

xmhhh 发表于 2008-2-29 17:50:00

<pre class="prog_in_0">看帮助Com and ActiveX Automation中有</pre><pre class="prog_in_0">void addMenuThroughCom()</pre><pre class="prog_in_0">{</pre><pre class="prog_in_0">    AutoCAD::IAcadApplication *pAcad;</pre><pre class="prog_in_0">    AutoCAD::IAcadMenuBar *pMenuBar;</pre><pre class="prog_in_0">    AutoCAD::IAcadMenuGroups *pMenuGroups;</pre><pre class="prog_in_0">    AutoCAD::IAcadMenuGroup *pMenuGroup;</pre><pre class="prog_in_0">    AutoCAD::IAcadPopupMenus *pPopUpMenus;</pre><pre class="prog_in_0">    AutoCAD::IAcadPopupMenu *pPopUpMenu;</pre><pre class="prog_in_0">    AutoCAD::IAcadPopupMenuItem *pPopUpMenuItem;</pre><pre class="prog_in_0">    HRESULT hr = NOERROR;</pre><pre class="prog_in_0">    CLSID clsid;</pre><pre class="prog_in_0">    LPUNKNOWN pUnk = NULL;</pre><pre class="prog_in_0">    LPDISPATCH pAcadDisp = NULL; </pre><pre class="prog_in_0"></pre><pre class="prog_in_0">    hr = ::CLSIDFromProgID(L"AutoCAD.Application",</pre><pre class="prog_in_0">      &amp;clsid);</pre><pre class="prog_in_0">    if (FAILED(hr))</pre><pre class="prog_in_0">      return;</pre><pre class="prog_in_0">    if(::GetActiveObject(clsid, NULL, &amp;pUnk) != S_OK)</pre><pre class="prog_in_0">      return;</pre><pre class="prog_in_0"></pre><pre class="prog_in_0">    hr = pUnk-&gt;QueryInterface(IID_IDispatch, (LPVOID*) &amp;pAcadDisp);</pre><pre class="prog_in_0">    pUnk-&gt;Release();</pre><pre class="prog_in_0">    if (FAILED(hr))</pre><pre class="prog_in_0">      return;</pre><pre class="prog_in_0"></pre><pre class="prog_in_0">    hr = pAcadDisp-&gt;QueryInterface(AutoCAD::IID_IAcadApplication,             (void**)&amp;pAcad);</pre><pre class="prog_in_0">    pAcadDisp-&gt;Release();</pre><pre class="prog_in_0">    if (FAILED(hr))</pre><pre class="prog_in_0">      return;</pre><pre class="prog_in_0"></pre><pre class="prog_in_0">    pAcad-&gt;put_Visible(true);</pre><pre class="prog_in_0">    pAcad-&gt;get_MenuBar(&amp;pMenuBar);</pre><pre class="prog_in_0">    pAcad-&gt;get_MenuGroups(&amp;pMenuGroups);</pre><pre class="prog_in_0">    pAcad-&gt;Release();</pre><pre class="prog_in_0">    long numberOfMenus;</pre><pre class="prog_in_0">    pMenuBar-&gt;get_Count(&amp;numberOfMenus);</pre><pre class="prog_in_0">    pMenuBar-&gt;Release();</pre><pre class="prog_in_0">    VARIANT index;</pre><pre class="prog_in_0">    VariantInit(&amp;index);</pre><pre class="prog_in_0">    V_VT(&amp;index) = VT_I4;</pre><pre class="prog_in_0">    V_I4(&amp;index) = 0;</pre><pre class="prog_in_0">    pMenuGroups-&gt;Item(index, &amp;pMenuGroup);</pre><pre class="prog_in_0">    pMenuGroups-&gt;Release();</pre><pre class="prog_in_0"></pre><pre class="prog_in_0">    pMenuGroup-&gt;get_Menus(&amp;pPopUpMenus);</pre><pre class="prog_in_0">    pMenuGroup-&gt;Release();</pre><pre class="prog_in_0">    WCHAR wstrMenuName;</pre><pre class="prog_in_0">    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, </pre><pre class="prog_in_0">      "AsdkComAccess", -1, wstrMenuName, 256); </pre><pre class="prog_in_0">    if (!bIsMenuLoaded) {</pre><pre class="prog_in_0">      pPopUpMenus-&gt;Add(wstrMenuName, &amp;pPopUpMenu);</pre><pre class="prog_in_0">      if (pPopUpMenu != NULL) {</pre><pre class="prog_in_0">            pPopUpMenu-&gt;put_Name(wstrMenuName);</pre><pre class="prog_in_0">            WCHAR wstrMenuItemName;</pre><pre class="prog_in_0">            MultiByteToWideChar(CP_ACP, 0,"&amp;Add A ComCircle",</pre><pre class="prog_in_0">                -1, wstrMenuItemName, 256); </pre><pre class="prog_in_0">            WCHAR wstrMenuItemMacro;</pre><pre class="prog_in_0">            MultiByteToWideChar(CP_ACP, 0, "AsdkComCircle ",</pre><pre class="prog_in_0">                -1, wstrMenuItemMacro, 256); </pre><pre class="prog_in_0">            VariantInit(&amp;index);</pre><pre class="prog_in_0">            V_VT(&amp;index) = VT_I4;</pre><pre class="prog_in_0">            V_I4(&amp;index) = 0;</pre><pre class="prog_in_0">            pPopUpMenu-&gt;AddMenuItem(index, wstrMenuItemName,</pre><pre class="prog_in_0">                wstrMenuItemMacro, &amp;pPopUpMenuItem);</pre><pre class="prog_in_0">            VariantInit(&amp;index);</pre><pre class="prog_in_0">            V_VT(&amp;index) = VT_I4;</pre><pre class="prog_in_0">            V_I4(&amp;index) = 1;</pre><pre class="prog_in_0">            pPopUpMenu-&gt;AddSeparator(index, </pre><pre class="prog_in_0">                &amp;pPopUpMenuItem);</pre><pre class="prog_in_0">            MultiByteToWideChar(CP_ACP, 0,</pre><pre class="prog_in_0">                "Auto&amp;LISP Example", -1, </pre><pre class="prog_in_0">                wstrMenuItemName, 256); </pre><pre class="prog_in_0">            MultiByteToWideChar(CP_ACP, 0,</pre><pre class="prog_in_0">                "(prin1 \"Hello\") ", -1, </pre><pre class="prog_in_0">                wstrMenuItemMacro, 256); </pre><pre class="prog_in_0">            VariantInit(&amp;index);</pre><pre class="prog_in_0">            V_VT(&amp;index) = VT_I4;</pre><pre class="prog_in_0">            V_I4(&amp;index) = 2;</pre><pre class="prog_in_0">            pPopUpMenu-&gt;AddMenuItem(index, wstrMenuItemName,</pre><pre class="prog_in_0">                wstrMenuItemMacro, &amp;pPopUpMenuItem);</pre><pre class="prog_in_0">            VariantInit(&amp;index);</pre><pre class="prog_in_0">            V_VT(&amp;index) = VT_I4;</pre><pre class="prog_in_0">            V_I4(&amp;index) = numberOfMenus - 2;;</pre><pre class="prog_in_0">            pPopUpMenu-&gt;InsertInMenuBar(index);</pre><pre class="prog_in_0">            pPopUpMenu-&gt;Release();</pre><pre class="prog_in_0">            pPopUpMenuItem-&gt;Release();</pre><pre class="prog_in_0">
        </pre><pre class="prog_in_0">            bIsMenuLoaded = true;</pre><pre class="prog_in_0">      } else {</pre><pre class="prog_in_0">            acutPrintf("\nMenu not created.");</pre><pre class="prog_in_0">      }</pre><pre class="prog_in_0">    } else {</pre><pre class="prog_in_0">      VariantInit(&amp;index);</pre><pre class="prog_in_0">      V_VT(&amp;index) = VT_BSTR;</pre><pre class="prog_in_0">      V_BSTR(&amp;index) = wstrMenuName;</pre><pre class="prog_in_0">      pPopUpMenus-&gt;RemoveMenuFromMenuBar(index);</pre><pre class="prog_in_0">      VariantClear(&amp;index);</pre><pre class="prog_in_0">      bIsMenuLoaded = false;</pre><pre class="prog_in_0">    }</pre><pre class="prog_in_0">    pPopUpMenus-&gt;Release();</pre><pre class="prog_in_0">}</pre>
页: [1]
查看完整版本: ObkectARX为cad添加新的菜单