C# 是否总是在鼠标按下事件中增加矩形的大小?

C# 是否总是在鼠标按下事件中增加矩形的大小?,c#,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()

如何在鼠标按下事件中始终增大矩形的大小

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();
}
  • 按下鼠标启动计时器
  • 在计时器滴答声中运行代码
  • 在鼠标上你停止计时
  • 按下鼠标启动计时器
  • 在计时器滴答声中运行代码
  • 在鼠标上你停止计时

  • 当您单击鼠标按钮时,
    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所建议的那样。您可以通过设置计时器间隔来调整增加的“灵敏度”

    假设您使用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();
    }
    

    当您单击鼠标按钮时,
    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所建议的那样。您可以通过设置计时器间隔来调整增加的“灵敏度”

    假设您使用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();
    }
    

    你的问题是什么?您提供的代码有任何问题吗?是的,它只发生过一次,仅此而已,我想在保留鼠标期间增加。有一个类似的问题,答案是:Winforms的RepeatButton:或wpf您的问题是什么?您提供的代码有任何问题吗?是的,它只发生过一次,仅此而已,我想在保留鼠标期间增加。有一个类似的问题,答案是:Winforms的RepeatButton:或wpf的RepeatButton