【发布时间】:2014-01-23 18:23:00
【问题描述】:
我有一个带有鼠标单击事件处理程序的按钮。
当按下按钮(鼠标按下)时,会启动一个计时器以延迟模拟其他点击。单击运行位图转换,例如每次旋转0.5。
当释放按钮(鼠标向上)时,计时器停止。
Button类中的代码:
private void TreatMouseDown(object sender, MouseEventArgs e) {
// Following clicks
_repeteTimer.Tick += (senderTick, eTick) => {
_repeteTimer.Stop();
PerformClick();
_repeteTimer.Interval = _nextDelay;
_repeteTimer.Start();
};
// First click
PerformClick();
_repeteTimer.Interval = _firstDelay;
_repeteTimer.Start();
}
private void TreatMouseUp(object sender, MouseEventArgs e) {
_repeteTimer.Stop();
}
窗口中的代码:
btnRotation1.Click += (sender, e) => PHOTO_Treat(1);
private void PHOTO_Treat(int delta) {
if (!_inProgress) {
_photoRotation += delta * 0.5F;
PHOTO_Show();
}
}
private void PHOTO_Show(){
if (_inProgress) return;
_inProgress= true;
// Make image treatments ...
_inProgress = false;
}
问题是释放按钮后会再次发生几次转换,如果转换需要很长时间。
我怎样才能抑制剩余?
【问题讨论】:
-
也许你可以尝试一些其他的场景。例如,让
Timer始终打开。在内部按下鼠标按钮时设置一些标志,并在释放时重置。如果设置了标志,Timer将进行轮换,否则不会。另一件事是重绘。而是始终更改角度并使用Invalidate()开始重新绘制(这意味着请尽快重新绘制此控件)并在OnPaint内继续角度,而不是你做了什么(就像你没有使用定时器来同步旋转,而是依赖重绘,这就像你不使用定时器 -> 取决于电脑性能)。 -
使用 OnPaint 代替计时器对于使重绘适应 PC 性能很有用。我牢记这个想法。谢谢。