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

27/09/2013

Получение положения мыши (курсора) без события

AutoCAD API реализует интерфейс AcEdInputPointManager.InputPointMonitor который отслеживает любой ввод пользователя, в том числе и перемещение мыши. При помощи API можно отслеживать и сообщения в очереди Windows. Иногда нужно получить текущее положение мыши без наступления какого-либо события. Следующий код демонстрирует как это можно сделать. В действительности достаточно получить текущее положение курсора Windows и преобразовать его в координаты AutoCAD. Следует учитывать также ПСК.

Код - C++: [Выделить]
  1. static void getMousePosition(void)
  2. {    
  3.     // Получаем координаты курсора при помощи Windows API
  4.      POINT CursorPos;
  5.      GetCursorPos(&CursorPos);
  6.      acedGetAcadDwgView()->ScreenToClient(&CursorPos);
  7.  
  8.      // Получаем номер видового порта на
  9.      // основе клиентских координат Windows
  10.      int vpNum = acedGetWinNum(CursorPos.x, CursorPos.y);
  11.  
  12.      // Преобразуем координаты из координат документа AutoCAD
  13.      // в координаты активного видового порта
  14.      acedDwgPoint acPt, newPt;
  15.      acedCoordFromPixelToWorld(vpNum,
  16.                                CursorPos,
  17.                                acPt); 
  18.  
  19.      double worldPoint[3];
  20.      acedCoordFromPixelToWorld(vpNum,
  21.                                 CPoint(CursorPos.x,
  22.                                 CursorPos.y) ,
  23.                                 worldPoint);
  24.      acutPrintf(
  25.          L"\nКоординаты Модели (не ПСК): [%f, %f, %f]\n",
  26.                     worldPoint[0],
  27.                     worldPoint[1],
  28.                     worldPoint[2]);
  29.  
  30.  
  31.      // Выполним преобразование в ПСК
  32.      AcGeMatrix3d mat;
  33.      acedGetCurrentUCS(mat);
  34.  
  35.      AcGePoint3d ptUcs(worldPoint[0],
  36.                      worldPoint[1],
  37.                      worldPoint[2]);
  38.      ptUcs.transformBy(mat.inverse());
  39.  
  40.      resbuf wcs;
  41.      wcs.restype = RTSHORT;
  42.      wcs.resval.rint = 0;
  43.  
  44.      resbuf dcs;
  45.      dcs.restype = RTSHORT;
  46.      dcs.resval.rint = 2;
  47.  
  48.      // Преобразуем координаты из МСК в ПСК
  49.      double result[3];
  50.      acedTrans(asDblArray(ptUcs),
  51.                 &wcs,
  52.                 &dcs,
  53.                 0,
  54.                 result);
  55.      acutPrintf(
  56.        L"\nПоложение в Модели (с учетом ПСК): [%f, %f, %f]\n",
  57.          result[0], result[1], result[2]);
  58. }

Источник: 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