27/09/2013
Получение положения мыши (курсора) без события
AutoCAD API реализует интерфейс AcEdInputPointManager.InputPointMonitor который отслеживает любой ввод пользователя, в том числе и перемещение мыши. При помощи API можно отслеживать и сообщения в очереди Windows. Иногда нужно получить текущее положение мыши без наступления какого-либо события. Следующий код демонстрирует как это можно сделать. В действительности достаточно получить текущее положение курсора Windows и преобразовать его в координаты AutoCAD. Следует учитывать также ПСК.
Код - C++: [Выделить]
- static void getMousePosition(void)
- {
- // Получаем координаты курсора при помощи Windows API
- POINT CursorPos;
- GetCursorPos(&CursorPos);
- acedGetAcadDwgView()->ScreenToClient(&CursorPos);
- // Получаем номер видового порта на
- // основе клиентских координат Windows
- int vpNum = acedGetWinNum(CursorPos.x, CursorPos.y);
- // Преобразуем координаты из координат документа AutoCAD
- // в координаты активного видового порта
- acedDwgPoint acPt, newPt;
- acedCoordFromPixelToWorld(vpNum,
- CursorPos,
- acPt);
- double worldPoint[3];
- acedCoordFromPixelToWorld(vpNum,
- CPoint(CursorPos.x,
- CursorPos.y) ,
- worldPoint);
- acutPrintf(
- L"\nКоординаты Модели (не ПСК): [%f, %f, %f]\n",
- worldPoint[0],
- worldPoint[1],
- worldPoint[2]);
- // Выполним преобразование в ПСК
- AcGeMatrix3d mat;
- acedGetCurrentUCS(mat);
- AcGePoint3d ptUcs(worldPoint[0],
- worldPoint[1],
- worldPoint[2]);
- ptUcs.transformBy(mat.inverse());
- resbuf wcs;
- wcs.restype = RTSHORT;
- wcs.resval.rint = 0;
- resbuf dcs;
- dcs.restype = RTSHORT;
- dcs.resval.rint = 2;
- // Преобразуем координаты из МСК в ПСК
- double result[3];
- acedTrans(asDblArray(ptUcs),
- &wcs,
- &dcs,
- 0,
- result);
- acutPrintf(
- L"\nПоложение в Модели (с учетом ПСК): [%f, %f, %f]\n",
- result[0], result[1], result[2]);
- }
Источник: http://adndevblog.typepad.com/autocad/2013/08/get-mouse-cursor-position-without-event.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=232
Опубликовано 27.09.2013Отредактировано 30.09.2013 в 20:37:25