功能需求::
按下“+”按钮实现设定值加0.1,长摁“+”按钮实现设定值一直以0.1的基数累加,按钮弹起,停止累加。同样,摁下“-”按钮实现设定值减0.1,长摁“-”按钮实现设定值一直以0.1的基数累减,按钮弹起,停止累减。
需求分析:
功能拆分。
功能一:按下按钮实现设定值加0.1或者减0.1;
功能二:长摁按钮实现设定值一直以0.1的基数累加或者累减,按钮弹起,停止累加或者累减。
可行性分析。
针对功能一:普通的按钮Click事件即可以完成。
针对功能二:首先需要知道按钮是否被按下是否被弹起,所以直接使用MouseDown和MouseUp事件来确定和标识鼠标按钮的按下弹起动作。但是由于按钮事件的处理过程是交由主线程(UI线程)处理,如果直接使用循环(计算)会导致程序假死。因此使用委托异步调用循环(计算),利用按钮按下和弹起动作启动和停止循环(计算)。
话不多说了,来看看实现吧!
界面设计:
两个按钮:btnAdd、btnSub,设定值显示框:txtSetValue,其界面效果如下:
后台设计:
1.针对“+”按钮实现累加
(1)定义1个标识位,用此标识“+”按钮是否被按下,定义1个double类型的变量,存放加减后的TextBox的值。其定义如下
bool isAddMouseDown = false; //加按钮是否按下
double thisSetValue = 0D; //textBox显示的
(2)在鼠标按下的时候激活isAddMouseDown标识,计算,textBox显示累加效果。在正式计算之前首先获取获取txtSetValue的初始值,然后定义委托,最后调用显示。其具体过程如下
//+按钮鼠标按下事件
private void btnAdd_MouseDown(object sender, MouseEventArgs e)
{
isAddMouseDown = true; //激活按下标识
try
{
thisSetValue = Convert.ToDouble(txtSetValue.Text); //获取txtSetValue的初始值
}
catch (Exception)
{
thisSetValue = 0D;
}
Action handler = new Action(this.Add); //定义委托
handler.BeginInvoke(null, null); //异步调用
}
/// <summary>
/// 累加计算
/// </summary>
private void Add()
{
while (isAddMouseDown)
{
if (thisSetValue <= -1 || thisSetValue >= 50)
{
this.Invoke(new Action(() => MessageBox.Show("超出设定值!","警告")));
break;
}
else
{
thisSetValue += 0.1; //计算:每次累加的单位,如果要累加的精度大点,该值设定大一些
this.Invoke(new Action(() => this.txtSetValue.Text = Math.Round(thisSetValue, 2).ToString())); //界面显示
System.Threading.Thread.Sleep(100); //如果要速度块,将这个值修改小点
}
}
}
(3)在“+”按钮弹起的时候终止累加,即恢复标志。其过程如下
private void btnAdd_MouseUp(object sender, MouseEventArgs e)
{
isAddMouseDown = false;
txtHz.Text = thisValueReal.ToString();
}
2.针对“-”按钮实现累减
其过程实现原理和“+”类似,笔者就不再累述,希望读者自行完成。笔者总结:
(1).利用标志位来启动和终止循环。
(2).使用系统已定义好的Action完成委托的定义,然后利用BeginInvoke()的方法进行异步调用。
(3).使用lambad表达式可以让委托调用变得更简单明了。