Регистрация команды для функции обратного вызова UnknownCommand
Этот пример отвечает на множество вопросов по поводу функции обратного вызова unknownCommand и использования UnknownCommand.Когда когда-либо пользователь вводит неправильное или незарегистрированное имя команды или опечатывается, мы можем использовать механизм, чтобы перехватить команду с опечаткой и отправить нашу команду или зарегистрировать новую команду и отправить её.
В этом примере пользователь пытается ввести некоторую неизвестную команду, например, в функции обратного вызова, запущенной из реактора события unknownCommand, мы будем загружать наш "TestUknCom".
Некоторые проблемы и вопросы:
Как подавить сообщение о неизвестной команде в командной строке ?
Сейчас команда инженеров работает над этим. В идеале “AcadAppInfo::kNoAction” в функции loaderFunPtr должно решить эту проблему. Но уже сейчас есть обходной путь – прочитать строку неизвестной команды и на ходу зарегистрировать её, а разрегистрировать её при выгрузке приложения.
Как удалить команду, вызванную в функции обратного вызова из истории команд?
Флаг ACRX_CMD_NOHISTORY при регистрации команды поможет исключить её от добавления в историю команд.
- #include "StdAfx.h"
- #include "resource.h"
- class adskedReactor : public AcEditorReactor
- {
- public:
- // Конструктор / Деструктор
- adskedReactor(const bool autoInitAndRelease = true);
- virtual ~adskedReactor();
- //{{AFX_ARX_METHODS(adskedReactor)
- virtual void beginQuit();
- virtual void unknownCommand( const TCHAR* cmdStr, AcDbVoidPtrArray *al);
- //}}AFX_ARX_METHODS
- private:
- // Флаг автоинициализации и освобождения
- bool m_autoInitAndRelease;
- };
- adskedReactor::adskedReactor(const bool autoInitAndRelease)
- {
- m_autoInitAndRelease = autoInitAndRelease;
- if (m_autoInitAndRelease)
- if (NULL != acedEditor)
- acedEditor->addReactor(this);
- else
- m_autoInitAndRelease = false;
- }
- adskedReactor::~adskedReactor()
- {
- if (m_autoInitAndRelease)
- if (NULL != acedEditor)
- acedEditor->removeReactor(this);
- }
- void adskedReactor::beginQuit()
- {
- AcApDocumentIterator *pIt;
- pIt=acDocManager->newAcApDocumentIterator();
- while(!pIt->done())
- {
- // По всем открытым документам
- AcApDocument* pDoc=pIt->document();
- acDocManager->setCurDocument(pDoc);
- struct resbuf res;
- acedGetVar(_T("DBMOD"),&res);
- if(res.resval.rint) // Если чертеж менялся...
- {
- acDocManager->lockDocument(pDoc); // Блокируем
- // Если мы хотим сохранить...
- // SaveDb(pDoc);// Вызываем сохранение...
- // Если хотим игнорировать изменения...
- acdbSetDbmod(pDoc->database(),0); // Сбрасываем флаг изменений
- acDocManager->unlockDocument(pDoc); // разблокируем
- }
- pIt->step();
- }
- delete pIt;
- }
- /* Функция обратного вызова */
- CString gsCmd;
- AcadAppInfo::CmdStatus LoaderFunPtr(void *p)
- {
- acedPostCommand ((LPCTSTR) gsCmd) ;
- return AcadAppInfo::kNoAction;
- }
- /* Чтобы запретить сообщение о неизвестной команде,
- регистрируем на лету команду с этим именем */
- void unknwCommand()
- {
- /* Пустая функция */
- }
- void adskedReactor::unknownCommand( const TCHAR* cmdStr, AcDbVoidPtrArray *al)
- {
- /* Не забудем удалить команду после её завершения*/
- acedRegCmds->addCommand(_T("UNKGrp"), cmdStr, cmdStr, ACRX_CMD_MODAL, unknwCommand);
- CString unkCmd;
- unkCmd.Format(cmdStr);
- gsCmd.Format(_T("TestUknCom\n"));
- AcadAppInfo* pAppInfo = new AcadAppInfo();
- pAppInfo->setAppLoader(LoaderFunPtr);
- pAppInfo->setLoadReason(AcadApp::kLoadDisabled);
- pAppInfo->setAppName(_T("TestCBCom"));
- al->append(pAppInfo);
- }
- /* Arx-функция*/
- void TestUknCom()
- {
- acutPrintf(_T("TestUknCom вызвана \n"));
- }
- // Эта функция регистрирует ARX-команды.
- void AddCommand(const TCHAR* cmdGroup, const TCHAR* cmdInt, const TCHAR* cmdLoc,
- const int cmdFlags, const AcRxFunctionPtr cmdProc, const int idLocal = 0)
- {
- acedRegCmds->addCommand(cmdGroup, cmdInt, cmdLoc, cmdFlags, cmdProc);
- }
- // Инициализируем приложение. Регистрируем
- // команды, реакторы...
- void InitApplication()
- {
- adskedReactor *pEdReactor = new adskedReactor();
- acedEditor->addReactor(pEdReactor);
- AddCommand(_T("TestCBCom"), _T("TestUknCom"), _T("TestUknCom"),ACRX_CMD_NOHISTORY , TestUknCom);
- }
- // Выгружаем это приложение. Разрегистрируем все объекты,
- // зарегистрированные в InitApplication.
- void UnloadApplication()
- {
- acedRegCmds->removeCmd(_T("TestCBCom"),_T("TestUknCom"));
- }
- extern "C" AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void *pkt)
- //**************************************************************
- {
- switch(msg)
- {
- case AcRx::kInitAppMsg:
- acrxDynamicLinker->unlockApplication(pkt);
- acrxDynamicLinker->registerAppMDIAware(pkt);
- /* Загружаем команды */
- acrxBuildClassHierarchy(); /* для регистрации производных классов */
- InitApplication();
- break;
- case AcRx::kUnloadAppMsg:
- UnloadApplication();
- break;
- default:
- break;
- }
- return AcRx::kRetOK;
- }
Источник: http://adndevblog.typepad.com/autocad/2015/07/registering-command-for-unknowncommand-callback.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=3016
Опубликовано 15.09.2015