一个“鼠标重复”功能






3.67/5 (3投票s)
2000年4月9日

59099
模拟鼠标点击键盘重复行为的函数
只要
- 鼠标按钮按下,并且
- 鼠标指针保持在myRect范围内,就会执行DoClickThing()(你可以选择任何在WM_LBUTTONDOWN消息上调用的函数)。
你需要在你的CWnd派生类中重写OnLButtonDown、OnMouseMove、OnLButtonUp和OnTimer函数。重复速率设置为模拟键盘重复行为。
感谢Christian Sloper提供的想法。
void CTestCtrl::OnLButtonDown(UINT nFlags, CPoint point) { if(PtInRect(&myRect, point)) { DoClickThing(); SetCapture(); // initial timer interval = keyboard repeat delay 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); // set timer interval per keyboard repeat rate DWORD setting = 0; SystemParametersInfo(SPI_GETKEYBOARDSPEED, 0, &setting, 0); int interval = 400 - (setting * 12); TimerID = SetTimer(100, interval, NULL); TimerStep = 2; } if(TimerStep) DoClickThing(); }
