设为首页 加入收藏

TOP

22.1.13 处理按钮单击事件
2013-10-07 12:49:16 来源: 作者: 【 】 浏览:79
Tags:22.1.13 处理 按钮 单击 事件

22.1.13  处理按钮单击事件

单击某个按钮应该把该按钮上的数值修改为新的随机数。当然,新的随机数必须与其他按钮上的数值不同,还必须与该按钮上原来的数值不同。顺序给出整组数值是个好主意,但这样可能使新数值出现在某个不同的按钮上,因此使数值不按顺序显示可能更好。

处理按钮单击事件的过程对所有按钮来说都是相同的,因此可以创建一个通用的函数来做这项工作,以节省代码。可以定义一个Form1类的私有函数成员,使之为一组按钮中的特定Button对象生成新数值:

  1. // Generates a new value for button different from current button values  
  2. void SetNewValue(Button^ button, array<Button^>^ buttons,  
  3. int lowerLimit, int upperLimit)  
  4. {  
  5. int index = 0; // Index of button in buttons  
  6.  
  7. // Array to store button values  
  8. array<int>values = gcnew array<int>(buttons->Length);  
  9.  
  10. // Get values from buttons and find index for button  
  11. for(int i = 0 ; i < values->Length ; i++)  
  12. {  
  13. values[i]=Int32::Parse(buttons[i]->Text);// Get current button value  
  14.  
  15. // If current handle is same as button, save the index value  
  16. if(button == buttons[i])  
  17. iindex = i;  
  18. }  
  19.  
  20. int newValue = 0; // Store the new button value  
  21. // Check if it is different from the other button values  
  22. for(;;) // Loop until we get a good one  
  23. {  
  24. newValue = random->Next(lowerLimit, upperLimit); // Generate a value  
  25. if(IsValid(newValue, values, values->Length)) // If it's OK...  
  26. break; // ...end the loop  
  27. }  
  28. values[index] = newValue; // Store the new value at index  
  29.  
  30. Array::Sort(values); // Sort the value  
  31. for(int i = 0 ; i < values->Length ; i++) // and set the values  
  32. buttons[i]->Text = values[i].ToString();// as text on the buttons  

前两个函数形参是即将获得新数值的按钮和第一个按钮所属的按钮数组。后面两个形参指定数值的下限和上限。在第一个循环中,buttons数组中各个按钮的当前值被存入values数组中。该循环还为Button^类型的句柄(第一个实参)找出在buttons数组中的索引值。没有该索引值,就不知道values数组的哪一个元素将由新值替换。

新值是在无穷for循环中创建的。该机制与我们最初为按钮创建数值所使用的机制相同。在得到有效的新值之后,将其存入values数组中。然后,先对values数组中的元素进行排序,之后才将它们存储为buttons数组中各个按钮的Text属性值。可以使用该函数处理所有按钮的Click事件。

如果还没有这样做,就双击Lotto选项卡上的第一个按钮,为该按钮生成Click事件处理程序。可以编辑该处理程序的函数名,方法是打开按钮的Properties选项卡,选择Events按钮,然后修改Click事件的值。在按下Enter键之后,代码将更新为使用新名称。此处的新名称是lottoValue_Click。

可以把这个Click事件处理程序修改成调用刚刚添加到Form1类中的SetNewValue()函数:

  1. System::Void lottoValue_Click(System::Object^ sender, System::EventArgs^ e)  
  2. {  
  3. Button^ button = safe_cast<Button^>(sender);  
  4.  
  5. // Create the array of button handles  
  6. array<Button^>buttons = {lottoValue1, lottoValue2, lottoValue3,  
  7. lottoValue4, lottoValue5, lottoValue6};  
  8.  
  9. // Replace the value on button  
  10. SetNewValue(button, buttons, lottoUserMinimum, lottoUserMaximum);  

SetNewValue()函数的可用性使该处理程序函数非常简单。第一条语句存储被单击按钮的句柄。该事件处理程序的第一个形参是产生该事件的对象的句柄,因此所需的全部工作就是将其强制转换为适当的类型。然后,只是把各个按钮的句柄集中在一个数组中,并调用新添加的SetNewValue()函数-- 任务完成!

还必须处理Lotto选项卡上其他按钮的Click事件,但这不需要任何其他代码。打开第二个按钮的Properties窗口,然后单击Events按钮。如果单击Click事件值,那么将看到现有事件处理程序的列表;如果从列表中选择lottoValue_Click,那么供第一个按钮使用的事件处理程序将再次被注册为第二个按钮的事件处理程序。

可以为Lotto选项卡上剩下的4个按钮重复上述过程,这样响应Lotto选项卡上任何一个按钮的Click事件的都是同一个事件处理程序。

Euromillions选项卡上按钮的Click事件处理程序非常容易。双击Values组中5个按钮的第一个,创建事件处理程序。打开该按钮的Properties窗口,将Click事件的值修改为euroValue_Click。然后,可以像下面这样修改该处理程序的代码:

  1. System::Void euroValue_Click(System::Object^ sender, System::EventArgs^ e)  
  2. {  
  3. Button^ button = safe_cast<Button^>(sender);  
  4. array<Button^>buttons = {euroValue1, euroValue2, euroValue3,  
  5.  euroValue4, euroValue5 };  
  6. SetNewValue(button, buttons, euroUserMinimum, euroUserMaximum);  

该函数的工作情况与Lotto选项卡上那些按钮的处理程序完全相同。buttons数组包含Values组中5个按钮的句柄,其余工作都由SetNewValue()函数完成。如果打开组中其余4个按钮的Properties窗口,则可以选择让euroValue_Click()函数来响应各个按钮的Click事件。务必选择euroValue_Click,而不是lottoValue_Click!

处理Euromillions选项卡上的两个星值按钮遵循相同的过程。其处理程序的实现如下:

  1. System::Void euroStar_Click(System::Object^ sender, System::EventArgs^ e)  
  2. {  
  3. Button^ button = safe_cast<Button^>(sender);  
  4. array<Button^>buttons = { euroStar1, euroStar2 };  
  5. SetNewValue(button,buttons,euroStarsUserMinimum, euroStarsUserMaximum);  

把第二个按钮的Click事件的处理程序也设定为euro_StarClick,一切工作就都完成了。如果编译该示例,则只要在某个选项卡上单击某个按钮,就应该使该按钮显示一个新值。完成该示例的最后一步是使用户能够输入某个按钮的数值。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇22.1.14 响应上下文菜单(1) 下一篇22.1.14 响应上下文菜单(3)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: