Как получать уведомление об использовании полос прокрутки или зумирования в реальном времени
Есть несколько способов, чтобы получить уведомление в случае, когда экран обновляется при помощи колеса мыши или полос прокрутки.
Самый простым способом может быть субклассирование окна AutoCAD, и отлов всех сообщений WM_VSCROLL, WM_HSCROLL и WM_MOUSEWHEEL. Вы знаете, что экран будет обновляться, когда AutoCAD получит эти сообщения, и вы можете контролировать или фильтровать сообщения AutoCAD путем реализации монитора или фильтра сообщений AutoCAD. Но есть одна загвоздка. В монитор контролируемое сообщение попадёт до того, как AutoCAD отработает его. И на самом деле нет чистого способа для отслеживания сообщений AutoCAD сразу после их обработки AutoCAD. Таким образом, простейшим решением было бы установить таймер с минимальной временной задержкой, который будет использоваться для уведомления о завершении обновления экрана AutoCAD. Это подразумевает, что экран AutoCAD будет обновлен в течение этого времени, так что возможно это значение придётся изменить.
В WindowProc, вы можете убить таймер, и сбросить его для каждого последующего сообщения, полученного таким образом, что вы получали только одно обновление таймера для каждого контролируемого сообщения. Вот соответствующий код:
- WNDPROC dwgWndProc = NULL;
- virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
- // Вы *должны* вызвать On_kInitAppMsg здесь
- AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
- pReactor = new asdkEditorReactor(true);
- dwgWndProc = (WNDPROC)::SetWindowLong(acedGetAcadDwgView()->m_hWnd,
- GWL_WNDPROC, // Используйте GWLP_WNDPROC для платформы x64
- (long)myWndProc);
- return (retCode) ;
- }
- LRESULT CALLBACK myWndProc(HWND hwnd, UINT uMsg,
- WPARAM wParam,LPARAM lParam)
- {
- if(uMsg==WM_VSCROLL || uMsg==WM_HSCROLL ||
- uMsg==WM_MOUSEWHEEL)
- {
- acedGetAcadFrame()->KillTimer(10);
- acedGetAcadFrame()->SetTimer(10,100,TimerProc);
- }
- return ::CallWindowProc(dwgWndProc,hwnd,uMsg,wParam,lParam);
- }
- void CALLBACK TimerProc(HWND hWnd,UINT nMsg,
- UINT_PTR nIDEvent,DWORD dwTime)
- {
- screenUpdated();
- acedGetAcadFrame()->KillTimer(10);
- }
- void screenUpdated()
- {
- acutPrintf(L"Экран обновлён \n");
- }
Вы можете воспользоваться реактором редактора для обработки как обычной команды ПОКАЖИ (_ZOOM), так и зумирования в реальном времени. Вот пример кода:
- void asdkEditorReactor::commandEnded(const ACHAR* cmdStr)
- {
- if(!wcscmp(cmdStr,L"ZOOM") || !wcscmp(cmdStr,L"PAN"))
- screenUpdated();
- }
Обсуждение: http://adn-cis.org/forum/index.php?topic=3338
Опубликовано 15.01.2016