Тема: Как создать Menu

Подскажите возможно ли создать программно дополнительное меню в AUTOCADе пользуясь функцией createMenus(),описанной в примере polymnu.cpp,лежащем в ObjectARX/samples/entity/polysamp. Пробовал создать панель функцией createToolBar() этого примера, все успешно.Но вот функция createMenus что-то не работает.Скажите, если есть какие либо другие пути создания меню

Re: Как создать Menu

Олег Бевз пишет:

Но вот функция createMenus что-то не работает.

1. Не работает как? Что-то сообщает?
2. Код этой функции анализировал?
3. AutoCAD установлен русский?

Re: Как создать Menu

Вроде разобрался.Нашел похожую тему.Помогло добавление в код строки:
toolsMenu->InsertInMenuBar(vtIndex);
Но вот только теперь меню появляется с лишними пунктами: "Сброс блока", "Редактор блока","Контекстное редактирование блоков","Редактировать атрибуты...".Словно меню при создании захватывает другое меню.Была ли такая проблема?
PS.AutoCad становлен русский.

Re: Как создать Menu

Олег Бевз пишет:

Но вот только теперь меню появляется с лишними пунктами

Код свой покажи.

Re: Как создать Menu

Немного измененный пример polymnu:

 
 IAcadMenuGroup *mnuGrp=NULL;
...

static void cre ateMenus(IAcadMenuGroup *mnuGrp)
{

    mnuGrp = NULL;
    if (!getAcadMenuGroup(&mnuGrp))
    {
        return ;
    }

    //now get all the popup menus 
    IAcadPopupMenus  *mnus = NULL;
    HRESULT hr = S_OK;

    hr = mnuGrp->get_Menus(&mnus);
    
    long cnt = 0l;
    hr = mnus->get_Count(&cnt);
    mnuGrp->Release();

    //now get Tools menu
    IAcadPopupMenu *toolsMenu = NULL;
    BSTR   tempName = _T("My menu");
    VARIANT vtName;
    bool found = false;
    
    
    for (long i=0; i < 02; i++)
    {
        vtName.vt = VT_I4;
        vtName.lVal = i;
        hr = mnus->Item(vtName, &toolsMenu);
        
        if (FAILED(hr))
        {
            acutPrintf(_T("!!!!@##$!!!"));
            return ;
        }
        toolsMenu->put_Name(tempName);
        hr = toolsMenu->get_NameNoMnemonic(&tempName);
        CString mnuName(tempName);

        if(mnuName.CompareNoCase(_T("My menu"))==0)
        {
            found = true;
            break;
        }
        //acedAlert(_T("!!!"));
    }
    
   
    mnus->Release();
    if (!found)
    {
        acedAlert(_T("Could not found tools menu\n"));
        return;
    }

    hr = toolsMenu->get_Count(&cnt);
    VARIANT  vtIndex;
    vtIndex.vt = VT_I4;
    vtIndex.lVal = cnt + 1;
    toolsMenu->InsertInMenuBar(vtIndex);
    IAcadPopupMenuItem  *item1 = NULL;
    
    
    hr = toolsMenu->AddSeparator(vtIndex, &item1);
    
    item1->Release();
    vtIndex.lVal = cnt + 2;
    IAcadPopupMenu *polyMnu = NULL;
    hr = toolsMenu->AddSubMenu(vtIndex, L"My commands", &polyMnu);
    if(FAILED(hr))
        return;
    toolsMenu->Release();
    IAcadPopupMenuItem *polycmds = NULL;
    vtIndex.lVal = 0;
    hr = toolsMenu->AddMenuItem(vtIndex, L"Command1", _T("command1 "), &polycmds);
    vtIndex.lVal = 1;
    hr = toolsMenu->AddMenuItem(vtIndex, L"Command2", L"command1 ", &polycmds);
    vtIndex.lVal = 2;
    hr = toolsMenu->AddMenuItem(vtIndex, L"Command3", L"command1 ", &polycmds);
    vtIndex.lVal = 3;
    hr = toolsMenu->AddMenuItem(vtIndex, L"Command4", L"command1 ", &polycmds);
    vtIndex.lVal = 0;
    hr = polyMnu->AddMenuItem(vtIndex, L"Command1", L"command1 ", &polycmds);
    vtIndex.lVal = 1;
    hr = polyMnu->AddMenuItem(vtIndex, L"Command2", L"command1 ", &polycmds);
    vtIndex.lVal = 2;
    hr = polyMnu->AddMenuItem(vtIndex, L"Command3", L"command1 ", &polycmds);
    vtIndex.lVal = 3;
    hr = polyMnu->AddMenuItem(vtIndex, L"Command4", L"command1 ", &polycmds);
    vtIndex.lVal = 4;
    

  
    //  polycmds->Release();
    polyMnu->Release();
    return;
}

Re: Как создать Menu

Ты же вклиниваешься в чужое меню. Отсюда и результат. Замени в исходной функции CreateMenus (из polymnu.cpp) строку:

    if(mnuName.CompareNoCase("Tools")==0)


на

    if(mnuName.CompareNoCase("Tools")==0 || mnuName.CompareNoCase("Сервис")==0)

Re: Как создать Menu

Заменил строку - не помогло. Немного непонял зачем сравнивать название меню  с "Tools", а потом с "Сервис"?

(изменено: Александр Ривилис, 15 октября 2009г. 14:15:42)

Re: Как создать Menu

В английской версии AutoCAD в POP-меню есть строка Tools, что в локализованном русском AutoCAD соответствует пункту меню Сервис. Т.е. эта проверка позволит установить свои пункты меню как в английской, так и в русской версии AutoCAD.

Посмотри еще здесь примеры: http://www.cppblog.com/mzty/archive/200 … 53651.html

(изменено: Александр Ривилис, 15 октября 2009г. 15:06:55)

Re: Как создать Menu

static void TestComMenuADDMENU(void)
{
  IAcadMenuGroup *mnuGrp = NULL;
  if (!getAcadMenuGroup(&mnuGrp)) return ;

  //now get all the popup menus 
  IAcadPopupMenus  *mnus = NULL;
  HRESULT hr = S_OK;
  hr = mnuGrp->get_Menus(&mnus);
  long cnt = 0l;
  hr = mnus->get_Count(&cnt);
  mnuGrp->Release();
  
  //now get Tools menu
  IAcadPopupMenu *toolsMenu = NULL;
  BSTR   tempName;
  VARIANT vtIndex;

  // Проверяем нет ли еще нашего меню
  for (long i=0; i < cnt; i++) {
    V_VT(&vtIndex) = VT_I4;  V_I4(&vtIndex) = i;
    hr = mnus->Item(vtIndex, &toolsMenu);
    if (FAILED(hr)) return ;
    hr = toolsMenu->get_NameNoMnemonic(&tempName);
    CString mnuName(tempName);
    if(mnuName.CompareNoCase(_T("Мое меню"))==0) {
      acutPrintf(_T("\n\"Мое меню\" уже есть!"));
      mnus->Release();
      return;
    }
  }

  // Создаем наше меню

  IAcadPopupMenu *myPopUpMenu = NULL;
  mnus->Add(_T("Мое меню"),&myPopUpMenu);

  IAcadPopupMenuItem *myPopUpMenuItem = NULL;
  V_I4(&vtIndex) = 0;
  hr = myPopUpMenu->AddMenuItem(vtIndex, L"Команда1", L"_Command1 ", &myPopUpMenuItem);
  V_I4(&vtIndex) = 1;
  hr = myPopUpMenu->AddMenuItem(vtIndex, L"Команда2", L"_Command2 ", &myPopUpMenuItem);
  V_I4(&vtIndex) = 2;
  hr = myPopUpMenu->AddMenuItem(vtIndex, L"Команда3", L"_Command3 ", &myPopUpMenuItem);
  
  // Добавлем наше меню в самый конец меню бар
  V_I4(&vtIndex) = cnt-1;
  myPopUpMenu->InsertInMenuBar(vtIndex);
  myPopUpMenuItem->Release();
  myPopUpMenu->Release();
  mnus->Release();
}

Re: Как создать Menu

Большое спасибо