Имитация многоразового нажатия мышкой

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