ADN Open CIS
Сообщество программистов Autodesk в СНГ

04/06/2016

Добавление пользовательского меню к фрейму приложения AutoCAD

В AutoCAD 2016 представлен новый класс AdApplicationFrame, который  содержит множество API для доступа к фрейму приложения.

В этой статье мы покажем как создать и добавить свое меню вместо существующей строки меню AutoCAD (‘MENUBAR’).

При помощи экземпляра AdApplicationFrame мы можем добавлять MFC-элементы пользовательского интерфейса в наш AutoCAD.

Добавление пользовательского меню:

Код - C++: [Выделить]
  1. static void testAddCustomMenu()
  2. {
  3.   Acad::ErrorStatus error = Acad::eOk;
  4.   AdApplicationFrame* pNewAppFrame = acedGetApplicationFrame();
  5.   pNewAppFrame != NULL ? error = Acad::eOk : error = Acad::eNullPtr;
  6.   HMENU hDefaultMenu = NULL;  /* Нужно для восстановления исходного меню AutoCAD */
  7.   HMENU hNewMenu = NULL;
  8.   CString strDirName;
  9.   HMODULE hm = NULL;
  10.  
  11.   /* Переключаем ресурсы на наше приложение */
  12.   /* Нужно включить видимость меню */
  13.  
  14.   if(!pNewAppFrame->IsMenuBarVisible())
  15.     pNewAppFrame->EnableMenuBar(true);
  16.  
  17.  
  18.   CAcModuleResourceOverride hResources(AddCustomMenuDLL.ModuleResourceInstance());
  19.  
  20.   if (eOkVerify(error))
  21.   {
  22.     /* Получаем указатель на строку меню (Menubar) */
  23.  
  24.     AdMenuBar* pMenuBar = NULL;
  25.     pMenuBar = pNewAppFrame->GetMenuBar();
  26.     pMenuBar != NULL ? error = Acad::eOk : error = Acad::eNullPtr;
  27.     if (eOkVerify(error))
  28.     {
  29.       hDefaultMenu = pMenuBar->GetMenuHandle();
  30.       if (hDefaultMenu != 0)
  31.       {
  32.         hm = _hdllInstance;
  33.  
  34.         if (hm != NULL)
  35.         {
  36.           // Устанавливаем своё меню
  37.           hNewMenu = LoadMenu(hm, MAKEINTRESOURCE(IDR_MENU1));
  38.           if (hNewMenu != NULL)
  39.           {
  40.             bool bOk = pMenuBar->SetMenuHandle(hNewMenu);
  41.             if(bOk) {
  42.               pMenuBar->UpdateMenu();
  43.             }
  44.             else
  45.               error = (Acad::ErrorStatus)Acad::eFailed;
  46.           }
  47.           else
  48.           {
  49.             error = Acad::eNullHandle;
  50.           }
  51.  
  52.           // Для возврата к меню по-умолчанию:
  53.           /*
  54.           if (pMenuBar->SetMenuHandle(hDefaultMenu))
  55.               pMenuBar->UpdateMenu();
  56.           else
  57.               error = (Acad::ErrorStatus)Acad::eFailed;
  58.           */
  59.         }
  60.         else
  61.           error = Acad::eNullHandle;
  62.       }
  63.       else
  64.         error = Acad::eNullHandle;
  65.     }
  66.     else
  67.       error = Acad::eUnrecoverableErrors;
  68.  
  69.   }
  70.   else
  71.     error = Acad::eNullPtr;
  72.   acutPrintf(_T("\n%s"), acadErrorStatusText(error));
  73. }

 

Получение учетных данных пользователя:

Если пользователь вошли в AutoCAD и A360, мы можем получить идентификатор пользователя и имя пользователя с помощью следующих API. Раньше эту же информацию можно было получить при помощи системных переменных ONLINEUSERID и ONLINEUSERNAME:

 

Код - C++: [Выделить]
  1. static void getUserCredentials()
  2. {
  3.   Acad::ErrorStatus error = Acad::eOk;
  4.   AdApplicationFrame* pNewAppFrame = acedGetApplicationFrame();
  5.   pNewAppFrame != NULL ? error = Acad::eOk : error = Acad::eNullPtr;
  6.   if (eOkVerify(error))
  7.   {
  8.     CString userId;
  9.     CString userName;
  10.     int bOK = -1;
  11.  
  12.     /* Проверяем подключен ли пользователь к A360*/
  13.  
  14.     if (pNewAppFrame->IsLoggedIn())
  15.     {
  16.       /* Аналогично ONLINEUSERID и ONLINEUSERNAME */
  17.  
  18.       bOK = pNewAppFrame->GetLoginUserId(userId.GetBuffer(BUFSIZE), BUFSIZE);
  19.       acutPrintf(_T("\n Идентификатор пользователя id : [%s]"), userId);
  20.       userId.ReleaseBuffer();
  21.       bOK = pNewAppFrame->GetLoginUserName(userName.GetBuffer(BUFSIZE), BUFSIZE);
  22.       acutPrintf(_T("\n Имя пользователя : [%s]"), userName);
  23.       userName.ReleaseBuffer();
  24.       int server = pNewAppFrame->GetServer();
  25.       acutPrintf(_T("\n Номер сервера : [%d]"), server);
  26.     }
  27.   }
  28. }

 

Источник: http://adndevblog.typepad.com/autocad/2016/06/adding-custom-menu-to-autocad-application-frame.html

 

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=7134

Опубликовано 04.06.2016