CSCAD 菜单栏的设置说明

CSCAD 菜单栏的设置说明

一.引用库方面

ObjectArx引用的acax24ENU.tlb库,使用CSCAD sdk时要改为axbricscaddb1.tlb,和axbricscadapp1.tlb。如下图所示:

二.特性化更改:

1. 模型空间的右键菜单修改暂不可以使用

  1. QueryInterface的IID对应的命名空间修改

 

或者在开头使用对应的空间

  1. put_Visible参数设置:

4 .取消退出命令字符串,0x1B改为003

 详细代码如下:


#if defined(_DEBUG) && !defined(AC_FULL_DEBUG)
#error _DEBUG should not be defined except in internal Adesk debug builds
#endif

#ifdef _CSCAD
#pragma warning( disable : 4278 )
#import "axbricscaddb1.tlb" no_implementation raw_interfaces_only named_guids
#import "axbricscadapp1.tlb" no_implementation raw_interfaces_only named_guids
#pragma warning( default : 4278 )
#else
#pragma warning( disable : 4278 )
#import "acax24ENU.tlb" no_implementation raw_interfaces_only named_guids
#pragma warning(default : 4278)
#endif // _CSCAD


#include <rxregsvc.h>
#include <aced.h>
#include <adslib.h>
#include "tchar.h"

#ifdef _CSCAD
using namespace BricscadApp;
using namespace BricscadDb;
#else
using namespace AutoCAD;
#endif

static bool bIsToolbarLoaded = false;
void
addToolbarThroughCom()
{
    IAcadApplication* pAcad;
    IAcadMenuBar* pMenuBar;
    IAcadMenuGroups* pMenuGroups;
    IAcadMenuGroup* pMenuGroup;
    IAcadToolbars* pToolbars;
    IAcadToolbar* pToolbar;
    IAcadToolbarItem* pToolbarItem;


    HRESULT hr = NOERROR;
    LPUNKNOWN pUnk = NULL;
    LPDISPATCH pAcadDisp = acedGetIDispatch(true);
    if (pAcadDisp == NULL)
    {
        return;
    }

    //hr = pAcadDisp->QueryInterface(IID_IAcadApplication, (void**)&pAcad);
#ifdef _CSCAD
    hr = pAcadDisp->QueryInterface(BricscadApp::IID_IAcadApplication, (void**)&pAcad);
#else
    hr = pAcadDisp->QueryInterface(AutoCAD::IID_IAcadApplication, (void**)&pAcad);
#endif // _CSCAD
    
    
    
    pAcadDisp->Release();
    if (FAILED(hr))
    {
        return;
    }

#ifdef _CSCAD
    pAcad->put_Visible(VARIANT_TRUE);
#else
    pAcad->put_Visible(true);
#endif // _CSCAD
    pAcad->get_MenuBar(&pMenuBar);
    pAcad->get_MenuGroups(&pMenuGroups);
    pAcad->Release();
    long numberOfMenus;
    pMenuBar->get_Count(&numberOfMenus);
    pMenuBar->Release();


    VARIANT index, FlyoutButton;
    VariantInit(&index);
    V_VT(&index) = VT_I4;
    V_I4(&index) = 0;

    pMenuGroups->Item(index, &pMenuGroup);
    pMenuGroups->Release();

    pMenuGroup->get_Toolbars(&pToolbars);
    pMenuGroup->Release();

    WCHAR wstrMenuName[256];
#ifdef UNICODE
    _tcscpy(wstrMenuName, L"TestToolbar");
#else  // !UNICODE
    MultiByteToWideChar(CP_ACP, 0, "TestToolbar", -1, wstrMenuName, 256);
#endif // !UNICODE


    // 启用同一的命令来加载/卸载工具栏。
    if (!bIsToolbarLoaded) {
        pToolbars->Add(wstrMenuName, &pToolbar);

        if (!pToolbar) {
            pToolbars->Release();
            bIsToolbarLoaded = false;
            return;
        }

        pToolbar->Dock(acToolbarDockBottom);

        WCHAR wstrToolbarItemName[256];
        WCHAR wstrToolbarItemMacro[256];
        #ifdef UNICODE
            _tcscpy(wstrToolbarItemName, L"&Add A ComCircle");
            _tcscpy(wstrToolbarItemMacro, L"AsdkComCircle ");
        #else  // !UNICODE
            MultiByteToWideChar(CP_ACP, 0, "&Add A ComCircle", -1, wstrToolbarItemName, 256);
            MultiByteToWideChar(CP_ACP, 0, "AsdkComCircle ", -1, wstrToolbarItemMacro, 256);
        #endif // !UNICODE

        VariantInit(&index);
        V_VT(&index) = VT_I4;
        V_I4(&index) = 0;
        VariantInit(&FlyoutButton);
        V_VT(&index) = VT_I4;
        V_I4(&index) = 0;
        pToolbar->AddToolbarButton(index, wstrToolbarItemName, wstrToolbarItemMacro, bstr_t(L"_HELP"), FlyoutButton, &pToolbarItem); 
        pToolbarItem->Release();

        // 分隔符
        VariantInit(&index);
        V_VT(&index) = VT_I4;
        V_I4(&index) = 1;
        IAcadToolbarItem* pToolbarSep;
        pToolbar->AddSeparator(index, &pToolbarSep);
        pToolbarSep->Release();

        pToolbar->Release();
        bIsToolbarLoaded = true;
    }
    else {
        VariantInit(&index);
        V_VT(&index) = VT_BSTR;
        V_BSTR(&index) = SysAllocString(wstrMenuName); 
        IAcadToolbar* pToolbar;
        pToolbars->Item(index, &pToolbar);
        if (pToolbar != NULL)
        {
            pToolbar->Delete();
            pToolbar->Release();
        }
        bIsToolbarLoaded = false;
    }
    pToolbars->Release();
}

void addMenuThroughCom()
{
    OutputDebugString(_T("Adding Graph Menu..."));

    IAcadApplication* spAcad = nullptr;
    IAcadMenuBar* spMenuBar = nullptr;
    IAcadMenuGroups* spMenuGroups = nullptr;
    IAcadMenuGroup* spMenuGroup = nullptr;
    IAcadPopupMenus* spPopUpMenus = nullptr;
    IAcadPopupMenu* spPopUpMenu = nullptr;
    IAcadPopupMenuItem* spPopUpMenuItem = nullptr;

    HRESULT hr = NOERROR;

    do 
    {
        IDispatchPtr pDisp = acedGetIDispatch(TRUE);
        if (pDisp == NULL) {
            OutputDebugString(_T("Error,acedGetIDispatch(TRUE)"));
            break;
        }

        if (FAILED(pDisp->QueryInterface(&spAcad))) {
            OutputDebugString(_T("Error,FAILED(pDisp->QueryInterface(&spAcad)"));
            pDisp->Release();
            break;
        }
        pDisp->Release();

#ifdef _CSCAD
        if (FAILED(spAcad->put_Visible(VARIANT_TRUE))) {
#else
        if (FAILED(spAcad->put_Visible(true))) {
#endif // _CSCAD 
            spAcad->Release();
            OutputDebugString(_T("Error,FAILED(spAcad->put_Visible(true))"));
            break;
        }
        if (FAILED(spAcad->get_MenuBar(&spMenuBar))) {
            spAcad->Release();
            OutputDebugString(_T("Error,FAILED(spAcad->get_MenuBar(&spMenuBar))"));
            break;
        }
        long number = 0;
        if (FAILED(spMenuBar->get_Count(&number))) {
            spAcad->Release();
            spMenuBar->Release();
            break;
        }
        spMenuBar->Release();
        if (FAILED(spAcad->get_MenuGroups(&spMenuGroups))) {
            spAcad->Release();
            OutputDebugString(_T("Error,FAILED(spAcad->get_MenuGroups(&spMenuGroups))"));
            break;
        }
        spAcad->Release();

        VARIANT index;
        VariantInit(&index);
        V_VT(&index) = VT_I4;
        V_I4(&index) = 0;
        if (FAILED(spMenuGroups->Item(index, &spMenuGroup))) {
            spMenuGroups->Release();
            OutputDebugString(_T("Error,FAILED(spMenuGroups->Item(index, &spMenuGroup))"));
            break;
        }
        spMenuGroups->Release();
        if (FAILED(spMenuGroup->get_Menus(&spPopUpMenus))) {
            spMenuGroup->Release();
            OutputDebugString(_T("Error,FAILED(spMenuGroup->get_Menus(&spPopUpMenus))"));
            break;
        }
        spMenuGroup->Release();

        WCHAR wstrMenuName[256];
#ifdef UNICODE
        _tcscpy(wstrMenuName, L"wstrMenuName");
#else  // !UNICODE
        MultiByteToWideChar(CP_ACP, 0, "wstrMenuName", -1, wstrToolbarItemName, 256);
#endif // !UNICODE

        VariantInit(&index);
        V_VT(&index) = VT_BSTR;
        V_BSTR(&index) = SysAllocString(bstr_t(_T("wstrMenuName")));
        if (SUCCEEDED(spPopUpMenus->Item(index, &spPopUpMenu))) {
            long l(0);
            spPopUpMenu->get_Count(&l);
            VARIANT indexTmp;
            for (int i= l -1; i>=0;--i)
            {
                VariantInit(&indexTmp);
                V_VT(&indexTmp) = VT_I4;
                V_I4(&indexTmp) = i;
                spPopUpMenu->Item(indexTmp, &spPopUpMenuItem);
                spPopUpMenuItem->Delete();
                spPopUpMenuItem->Release();
            }
            spPopUpMenus->RemoveMenuFromMenuBar(index);
            spPopUpMenu->RemoveFromMenuBar();
            spPopUpMenu->Release();
            spPopUpMenus->Release();
            break;
        }
        else 
        {
            spPopUpMenus->Add(wstrMenuName, &spPopUpMenu);
            spPopUpMenus->Release();
        }
       
        VariantInit(&index);
        V_VT(&index) = VT_I4;
        V_I4(&index) = 0;
#ifdef _CSCAD
        if (FAILED(spPopUpMenu->AddMenuItem(index, bstr_t(_T("Item 1")), bstr_t(_T("\003_HELP")), &spPopUpMenuItem))) {
#else
        if (FAILED(spPopUpMenu->AddMenuItem(index, bstr_t(_T("Item 1")), bstr_t(_T("\x1B_HELP")), &spPopUpMenuItem))) {
#endif // _CSCAD 
            spPopUpMenuItem->Release();
            break;
        }
        spPopUpMenuItem->Release();

        V_VT(&index) = VT_I4;
        V_I4(&index) = 1;
        if (FAILED(spPopUpMenu->AddMenuItem(index, bstr_t(_T("Item 2")), bstr_t(_T("_HELP")), &spPopUpMenuItem))) break;

        spPopUpMenuItem->Release();


        VariantInit(&index);
        V_VT(&index) = VT_I4;
        V_I4(&index) = number - 2;
        if (FAILED(spPopUpMenu->InsertInMenuBar(index))) break;
        spPopUpMenu->Release();
    } while (0);
    spAcad->put_WindowState(acMax);
}

void
initApp()
{
    ads_printf(_T("AsdkComAccess ARX Test; Type ComMenu to execute"));

    // register a command with the AutoCAD command mechanism
    // 菜单栏更改
    acedRegCmds->addCommand(_T("AsdkComAccess_COMMANDS"), _T("AsdkComMenu"), _T("ComMenu"), ACRX_CMD_MODAL, addMenuThroughCom);
    // 工具框更改
    acedRegCmds->addCommand(_T("AsdkComAccess_COMMANDS"), _T("AsdkComToolbar"), _T("Combar"), ACRX_CMD_MODAL, addToolbarThroughCom);
}

void unloadApp()
{
    
    
    // Remove the command group added via acedRegCmds->addCommand
    //
    acedRegCmds->removeGroup(_T("AsdkComAccess_COMMANDS"));

}

extern "C" AcRx::AppRetCode 
acrxEntryPoint(AcRx::AppMsgCode msg, void* appId)
{
    switch (msg) {
    case AcRx::kInitAppMsg:
        acrxDynamicLinker->unlockApplication(appId);
        acrxDynamicLinker->registerAppMDIAware(appId);
        initApp();
        break;
    case AcRx::kUnloadAppMsg:
        unloadApp();
        break;
    case AcRx::kLoadDwgMsg:

        break;
    case AcRx::kUnloadDwgMsg:

        break;
    case AcRx::kInvkSubrMsg:

        break;
    default:
        ;
    }
    return AcRx::kRetOK;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值