This executes DoClickThing()
(any function you wish to
have called on a WM_LBUTTONDOWN message) as long as
- the mouse button is down and
- the mouse pointer remains within myRect.
You need to override your OnLButtonDown
, OnMouseMove
,
OnLButtonUp
and OnTimer
overrides in your CWnd
derived class. The repeat rate is set to simulate the keyboard repeat behavior.
Thanks to Christian Sloper for the idea.
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();
}