菜单栏的设置说明"/>
CSCAD 菜单栏的设置说明
CSCAD 菜单栏的设置说明
一.引用库方面
ObjectArx引用的acax24ENU.tlb库,使用CSCAD sdk时要改为axbricscaddb1.tlb,和axbricscadapp1.tlb。如下图所示:
二.特性化更改:
1. 模型空间的右键菜单修改暂不可以使用
- QueryInterface的IID对应的命名空间修改
或者在开头使用对应的空间
- 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;
}
更多推荐
CSCAD 菜单栏的设置说明
发布评论