Находим примитив под курсором при помощи Win32 и ObjectARX
Вопрос:
Как найти примитив под курсором с использованием чистого Win32?
Ответ:
Лучший способ для нахождения примитива под курсором/перекрестьем – использование класса AcEdInputPointMonitor. Но если вам нужно использовать только Win32, это можно сделать так …
Во-первых, чтобы перехватить события мыши перед любым обычным действием AutoCAD (таким как нажатие или отпускание кнопки мыши), вы должны зарегистрировать свой обработчик события с помощью функции acedRegisterFilterWinMsg(). В ObjectARX 2008 SDK есть отличный пример, показывающий как это сделать (objectarx\samples\editor\mfcsamps\pretranslate). Посмотрите его, чтобы понять как перехватывать события окна AutoCAD.
Во-вторых, в функции обработки события можно использовать функцию acedSSGet() с опцией "_:E" (выбор всего под курсором внутри pickbox). Указывая только первую точку можно получить выбор точно в позиции курсора.
Следующий код определяет функцию, которая регистрируется при помощи acedRegisterFilterWinMsg(). Чтобы проверить этот код достаточно заменить функцию FilterMouse() из примера проекта (\objectarx\samples\editor\mfcsamps\pretranslate) следующей функцией.
- BOOL filterMouse(MSG *pMsg)
- {
- if( pMsg->message == WM_MOUSEMOVE ||
- pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_LBUTTONUP ) {
- acedDwgPoint cpt={ 0, 0, 0 };
- CPoint cPnt(pMsg->lParam);
- acedCoordFromPixelToWorld(cPnt, cpt) ;
- ads_point pt={ cpt[X], cpt[Y], 0 } ;
- ads_name ss;
- acedSSGet(L"_:E", pt, NULL, NULL, ss) ;
- long len =0 ;
- acedSSLength(ss, &len) ;
- acutPrintf(L"\nКоличество элементов в ss %d", len) ;
- acedSSFree(ss) ;
- if ( pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_LBUTTONUP )
- unmouse ();
- }
- return (FALSE) ; //----- продолжаем
- }
Обсуждение: http://adn-cis.org/forum/index.php?topic=642
Опубликовано 29.03.2014Отредактировано 31.03.2014 в 00:59:55