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

15/01/2016

Как получать уведомление об использовании полос прокрутки или зумирования в реальном времени

Есть несколько способов, чтобы получить уведомление в случае, когда экран обновляется при помощи колеса мыши или полос прокрутки.

Самый простым способом может быть субклассирование окна AutoCAD, и отлов всех сообщений WM_VSCROLL, WM_HSCROLL и WM_MOUSEWHEEL. Вы знаете, что экран будет обновляться, когда AutoCAD получит эти сообщения, и вы можете контролировать или фильтровать сообщения AutoCAD путем реализации монитора или фильтра сообщений AutoCAD. Но есть одна загвоздка. В монитор контролируемое сообщение попадёт до того, как AutoCAD отработает его. И на самом деле нет чистого способа для отслеживания сообщений AutoCAD сразу после их обработки AutoCAD. Таким образом, простейшим решением было бы установить таймер с минимальной временной задержкой, который будет использоваться для уведомления о завершении обновления экрана AutoCAD. Это подразумевает, что экран AutoCAD будет обновлен в течение этого времени, так что возможно это значение придётся изменить.

В WindowProc, вы можете убить таймер, и сбросить его для каждого последующего сообщения, полученного таким образом, что вы получали только одно обновление таймера для каждого контролируемого сообщения. Вот соответствующий код:

Код - C++: [Выделить]
  1. WNDPROC dwgWndProc = NULL;
  2. virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  3.  
  4.  // Вы *должны* вызвать On_kInitAppMsg здесь
  5. AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
  6.  
  7. pReactor = new asdkEditorReactor(true);
  8. dwgWndProc = (WNDPROC)::SetWindowLong(acedGetAcadDwgView()->m_hWnd,
  9.   GWL_WNDPROC, // Используйте GWLP_WNDPROC для платформы x64
  10.   (long)myWndProc);
  11.  
  12.  return (retCode) ;
  13. }
  14. LRESULT CALLBACK myWndProc(HWND hwnd, UINT uMsg,
  15. WPARAM wParam,LPARAM lParam)
  16. {
  17.  if(uMsg==WM_VSCROLL || uMsg==WM_HSCROLL ||
  18.   uMsg==WM_MOUSEWHEEL)
  19. {
  20.   acedGetAcadFrame()->KillTimer(10);
  21.   acedGetAcadFrame()->SetTimer(10,100,TimerProc);
  22. }
  23.  
  24.  return ::CallWindowProc(dwgWndProc,hwnd,uMsg,wParam,lParam);
  25. }
  26. void CALLBACK TimerProc(HWND hWnd,UINT nMsg,
  27. UINT_PTR nIDEvent,DWORD dwTime)
  28. {
  29. screenUpdated();
  30. acedGetAcadFrame()->KillTimer(10);
  31. }
  32.  
  33. void screenUpdated()
  34. {
  35. acutPrintf(L"Экран обновлён \n");
  36. }

Вы можете воспользоваться реактором редактора для обработки как обычной команды ПОКАЖИ (_ZOOM), так и зумирования в реальном времени. Вот пример кода:

Код - C++: [Выделить]
  1. void asdkEditorReactor::commandEnded(const ACHAR* cmdStr)
  2. {
  3.  if(!wcscmp(cmdStr,L"ZOOM") || !wcscmp(cmdStr,L"PAN"))
  4.   screenUpdated();
  5. }

 

Источник: http://adndevblog.typepad.com/autocad/2013/01/how-to-receive-notifications-when-the-scroll-bars-or-real-time-zoom-is-used.html

 

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=3338

Опубликовано 15.01.2016