总是通过鼠标按下事件增加矩形的大小?

时间:2011-11-24 20:19:15

标签: c#

如何使用鼠标按下事件增加矩形的大小?

private void btnPlus_MouseDown(object sender, MouseEventArgs e)
{
    rect.Width = rect.Width + 1;
    rect.Height = (int)(((rect.Width) / 4) * 3);

    label1.Text = rect.Width.ToString();
    label2.Text = rect.Height.ToString();

    pictureBox1.Invalidate();
}

2 个答案:

答案 0 :(得分:2)

  1. 在鼠标按下时启动计时器
  2. 在计时器上打勾,运行您的代码。
  3. 在鼠标按下时停止计时器。

答案 1 :(得分:1)

即使您将手指放在按钮上,当您单击鼠标按钮时,MouseDown事件仅被称为

如果您想在手指按下按钮时继续执行任务,请在MouseDown事件中创建一个新线程并在MouseUp事件中将其终止。在该线程中,执行while循环,执行增加:

private Thread _increaseWidthThread;
private Boolean _endThreadFlag;

private void btnPlus_MouseDown(object sender, MouseEventArgs e)
{
    _endThreadFlag = false;
    increaseWidthThread = new Thread(() => IncreaseWidth);
}

private void btnPlus_MouseDown(object sender, MouseEventArgs e)
{
    _endThreadFlag = true;
}

private void IncreaseWidth() {
    while (!_endThreadFlag) {
        this.Invoke((MethodInvoker) delegate {
            rect.Width = rect.Width + 1;
            rect.Height = (int)(((rect.Width) / 4) * 3);

            label1.Text = rect.Width.ToString();
            label2.Text = rect.Height.ToString();

            pictureBox1.Invalidate();
        });
    }
}

我使用一个标志来指示线程何时应该停止,以及一个匿名方法来从线程更新GUI。


修改

而不是使用线程,使用 Andrey 建议的timer可能更好(也更简单)。您可以通过设置定时器间隔来调整增加的“灵敏度”。

假设您使用winforms,那将是:

private System.Windows.Forms.Timer _timer; 

public ClassConstructor () {
    _timer = new System.Windows.Forms.Timer();
    _timer.Interval = 100;  // Set the "sensitivity"
    _timer.Elapsed += new ElapsedEventHandler(OnTimer);
}

private void btnPlus_MouseDown(object sender, MouseEventArgs e)
{
    timer.Start();
}

private void btnPlus_MouseDown(object sender, MouseEventArgs e)
{
    timer.Stop();
}

private void OnTimer(object sender, ElapsedEventArgs e) {
    rect.Width = rect.Width + 1;
    rect.Height = (int)(((rect.Width) / 4) * 3);

    label1.Text = rect.Width.ToString();
    label2.Text = rect.Height.ToString();

    pictureBox1.Invalidate();
}