04/06/2016
Добавление пользовательского меню к фрейму приложения AutoCAD
В AutoCAD 2016 представлен новый класс AdApplicationFrame, который содержит множество API для доступа к фрейму приложения.В этой статье мы покажем как создать и добавить свое меню вместо существующей строки меню AutoCAD (‘MENUBAR’).
При помощи экземпляра AdApplicationFrame мы можем добавлять MFC-элементы пользовательского интерфейса в наш AutoCAD.
Добавление пользовательского меню:
Код - C++: [Выделить]
- static void testAddCustomMenu()
- {
- Acad::ErrorStatus error = Acad::eOk;
- AdApplicationFrame* pNewAppFrame = acedGetApplicationFrame();
- pNewAppFrame != NULL ? error = Acad::eOk : error = Acad::eNullPtr;
- HMENU hDefaultMenu = NULL; /* Нужно для восстановления исходного меню AutoCAD */
- HMENU hNewMenu = NULL;
- CString strDirName;
- HMODULE hm = NULL;
- /* Переключаем ресурсы на наше приложение */
- /* Нужно включить видимость меню */
- if(!pNewAppFrame->IsMenuBarVisible())
- pNewAppFrame->EnableMenuBar(true);
- CAcModuleResourceOverride hResources(AddCustomMenuDLL.ModuleResourceInstance());
- if (eOkVerify(error))
- {
- /* Получаем указатель на строку меню (Menubar) */
- AdMenuBar* pMenuBar = NULL;
- pMenuBar = pNewAppFrame->GetMenuBar();
- pMenuBar != NULL ? error = Acad::eOk : error = Acad::eNullPtr;
- if (eOkVerify(error))
- {
- hDefaultMenu = pMenuBar->GetMenuHandle();
- if (hDefaultMenu != 0)
- {
- hm = _hdllInstance;
- if (hm != NULL)
- {
- // Устанавливаем своё меню
- hNewMenu = LoadMenu(hm, MAKEINTRESOURCE(IDR_MENU1));
- if (hNewMenu != NULL)
- {
- bool bOk = pMenuBar->SetMenuHandle(hNewMenu);
- if(bOk) {
- pMenuBar->UpdateMenu();
- }
- else
- error = (Acad::ErrorStatus)Acad::eFailed;
- }
- else
- {
- error = Acad::eNullHandle;
- }
- // Для возврата к меню по-умолчанию:
- /*
- if (pMenuBar->SetMenuHandle(hDefaultMenu))
- pMenuBar->UpdateMenu();
- else
- error = (Acad::ErrorStatus)Acad::eFailed;
- */
- }
- else
- error = Acad::eNullHandle;
- }
- else
- error = Acad::eNullHandle;
- }
- else
- error = Acad::eUnrecoverableErrors;
- }
- else
- error = Acad::eNullPtr;
- acutPrintf(_T("\n%s"), acadErrorStatusText(error));
- }
Получение учетных данных пользователя:
Если пользователь вошли в AutoCAD и A360, мы можем получить идентификатор пользователя и имя пользователя с помощью следующих API. Раньше эту же информацию можно было получить при помощи системных переменных ONLINEUSERID и ONLINEUSERNAME:
Код - C++: [Выделить]
- static void getUserCredentials()
- {
- Acad::ErrorStatus error = Acad::eOk;
- AdApplicationFrame* pNewAppFrame = acedGetApplicationFrame();
- pNewAppFrame != NULL ? error = Acad::eOk : error = Acad::eNullPtr;
- if (eOkVerify(error))
- {
- CString userId;
- CString userName;
- int bOK = -1;
- /* Проверяем подключен ли пользователь к A360*/
- if (pNewAppFrame->IsLoggedIn())
- {
- /* Аналогично ONLINEUSERID и ONLINEUSERNAME */
- bOK = pNewAppFrame->GetLoginUserId(userId.GetBuffer(BUFSIZE), BUFSIZE);
- acutPrintf(_T("\n Идентификатор пользователя id : [%s]"), userId);
- userId.ReleaseBuffer();
- bOK = pNewAppFrame->GetLoginUserName(userName.GetBuffer(BUFSIZE), BUFSIZE);
- acutPrintf(_T("\n Имя пользователя : [%s]"), userName);
- userName.ReleaseBuffer();
- int server = pNewAppFrame->GetServer();
- acutPrintf(_T("\n Номер сервера : [%d]"), server);
- }
- }
- }
Источник: 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