SdlFreeCAD 发表于 2023-7-17 17:03:40

ObjectARX(C++)创建工具栏源码

void createtoolbar(bool bShow = true)
{
    HRESULT hr = NOERROR;
    LPDISPATCH pAcadDisp = acedGetIDispatch(TRUE);
    if (pAcadDisp == NULL)
    {
      ASSERT(0);
      return;
    }
    AutoCAD::IAcadApplication* pAcad = nullptr;
    hr = pAcadDisp->QueryInterface(AutoCAD::IID_IAcadApplication, (void**)&pAcad);
    pAcadDisp->Release();
    if (FAILED(hr))
      return;
    AutoCAD::IAcadMenuGroups* pMenuGroups = nullptr;
    AutoCAD::IAcadMenuGroup* pMenuGroup = nullptr;
    hr = pAcad->get_MenuGroups(&pMenuGroups);
    if (FAILED(hr))
      return;
    VARIANT index;
    VariantInit(&index);
    V_VT(&index) = VT_I4;
    V_I4(&index) = 0;
    hr = pMenuGroups->Item(index, &pMenuGroup);
    if (FAILED(hr))
      return;
    pMenuGroups->Release();

    AutoCAD::IAcadToolbars *pToolBars = NULL;
    hr = pMenuGroup->get_Toolbars(&pToolBars);
    if (FAILED(hr))
      return;
    pMenuGroup->Release();
    long toolbarCnt = 0;
    pToolBars->get_Count(&toolbarCnt);
    AutoCAD::IAcadToolbar *pToolBar = NULL;
    for (int i = 0; i < toolbarCnt; i++)
    {
      VARIANT index;
      VariantInit(&index);
      V_VT(&index) = VT_I4;
      V_I4(&index) = i;
      AutoCAD::IAcadToolbar *pToolBarFind = NULL;
      pToolBars->Item(index, &pToolBarFind);
      BSTR bstrName;
      if (FAILED(pToolBarFind->get_Name(&bstrName)))
      {
            pToolBarFind->Release();
            continue;
      }
      CString strName;
      strName.Format(_T("%s"), bstrName);
      if (strName.CompareNoCase(ToolBarName) == 0)
      {
            pToolBar = pToolBarFind;
            break;
      }
      pToolBarFind->Release();
    }

    if (pToolBar != nullptr)
    {
      pToolBar->put_Visible(bShow ? VARIANT_TRUE : VARIANT_FALSE);
      pToolBar->Release();
      pToolBars->Release();
      return;
    }
    if (bShow == false)
    {
      return; //如果是隐藏,直接返回。
    }

    //添加工具条
    pToolBars->Add(ToolBarName, &pToolBar);
    if (pToolBar == NULL)
    {
      pToolBars->Release();
      return;
    }

    AutoCAD::IAcadToolbarItem *pToolBarItem = NULL;

    CString appFileName = acedGetAppName(); //取出完整的应用程序名称,含路径
    TCHAR dir, drive, path;
    _tsplitpath(appFileName, drive, dir, NULL, NULL);
    _tmakepath(path, drive, dir, NULL, NULL);
    CString bmpFile;

    long lIndex = 0;
    hr = pToolBar->AddToolbarButton(_variant_t((long)lIndex), L"参数设置", L"设置参数", L"\3\3_Setting\r", _variant_t(FALSE), &pToolBarItem);
    if (FAILED(hr))
      return;
    bmpFile.Format(_T("%s%s"), path, _T("icons\\Settings.bmp"));
    pToolBarItem->SetBitmaps((BSTR)(const TCHAR*)bmpFile, (BSTR)(const TCHAR*)bmpFile);
    pToolBarItem->Release();

    lIndex++;
    hr = pToolBar->AddSeparator(_variant_t((long)lIndex), &pToolBarItem);
    if (FAILED(hr))
      return;
    pToolBarItem->Release();

    pToolBar->Dock(AutoCAD::acToolbarDockLeft);
    pToolBar->Release();

    pToolBars->Release();
}

效果图:

4551986 发表于 2023-7-18 16:13:43

虽然看不懂还是顶一个

caoliu023 发表于 2023-7-19 10:09:05

感谢分享{:1_1:}

paulpipi 发表于 2024-3-10 09:34:54

看着挺好,但不会用;P
页: [1]
查看完整版本: ObjectARX(C++)创建工具栏源码