Имитация многоразового нажатия мышкой
Автор: Pete Sackett
Описывается простой алгоритм многоразового
вызова любой функции до тех пор пока нажата
кнопка мыши (проще говоря при посылке сообщения
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(); //наша функция, вызываемая многократно
}
|