Reputation: 807
How do I always increasing size of rectangle with mouse down event?
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();
}
Upvotes: 0
Views: 493
Reputation: 18743
The MouseDown
event is being called only once when you click the mouse button, even if you keep your finger on the button.
If you want to keep doing a task while your finger is down on the button, create a new thread in the MouseDown
event and kill it in the MouseUp
event. In the thread, perform a while
loop where you perform the increase:
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();
});
}
}
I use a flag to indicate to the thread when it should stop and an anonymous method to update the GUI from the thread.
Instead of using a thread, it is maybe better (and simpler) to use a timer
as suggested by Andrey. You will be able to adjust the "sensitivity" of the increase by setting the timer interval.
Assuming you use winforms, that would look like:
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();
}
Upvotes: 1
Reputation: 60055
Upvotes: 2