Описывается простой алгоритм многоразового вызова любой функции до тех пор пока нажата кнопка мыши (проще говоря при посылке сообщения WM_LBUTTONDOWN), либо пока курсор мышки не покинул определённой области. Вам необходимо переопределить OnLButtonDown, OnMouseMove, OnLButtonUp и OnTimer функции в Вашем классе, наследованном от CWnd. Скорость повторений установлена такой же как на клавиатуре. void CTestCtrl::OnLButtonDown(UINT nFlags, CPoint point) { if(PtInRect(&myRect, point)) { DoClickThing(); SetCapture();
// инициализируем интервал таймера = задержка повтора на клавиатуре int setting = 0; SystemParametersInfo(SPI_GETKEYBOARDDELAY, 0, &setting, 0); int interval = (setting + 1) * 250; TimerID = SetTimer(99, interval, NULL); TimerStep = 1; } }
void CTestCtrl::OnMouseMove(UINT nFlags, CPoint point) { if(TimerStep && !PtInRect(&myRect, point)) { KillTimer(TimerID); ReleaseCapture(); TimerStep = 0; } }
void CTestCtrl::OnLButtonUp(UINT nFlags, CPoint point) { if(TimerStep) { KillTimer(TimerID); ReleaseCapture(); TimerStep = 0; } }
void CTestCtrl::OnTimer(UINT nIDEvent) { if(TimerStep == 1) { KillTimer(TimerID);
// устанавливаем интервал таймера, взятый с клавиатуры DWORD setting = 0; SystemParametersInfo(SPI_GETKEYBOARDSPEED, 0, &setting, 0); int interval = 400 - (setting * 12); TimerID = SetTimer(100, interval, NULL); TimerStep = 2; }
if(TimerStep) DoClickThing(); //наша функция, вызываемая многократно }
|