设为首页 加入收藏

TOP

22.1.14 响应上下文菜单(2)
2013-10-07 12:49:00 来源: 作者: 【 】 浏览:72
Tags:22.1.14 响应 上下文 菜单

22.1.14  响应上下文菜单(2)

当然,可以从对话框对象的属性中获得极限值,但这种方法要求我们总是要首先设置相应属性。通过使用极限值作为形参,就消除了这种依赖性。

可以在Form1类的构造函数中创建该对话框对象,但需要给Form1类添加一个私有成员来存储对话框的句柄:

  1. private: UserValueDialog^ userValueDialog; 

还需要在Form1.h头文件中添加一条嵌入UserValueDialog.h的#include指令。

在Form1类的构造函数中添加下面这行创建对话框对象的代码:

  1. userValueDialog = gcnew UserValueDialog; 

如果在UserValueDialog窗体中双击OK按钮,将创建该按钮的Click事件处理程序。该函数应当获取用户在TextBox控件中输入的值,并检查输入值是否在允许范围之内,是否与所有当前值都不同。如果输入值因某种原因无效,则该函数应当显示一个消息框。下面是该函数的实现:

  1. System::Void OK_Click(System::Object^ sender, System::EventArgs^ e)  
  2. {  
  3. ::DialogResult result; // Stores return value from Show()  
  4. if(String::IsNullOrEmpty(textBox->Text))  
  5.                                       // Chheck for null or empty string  
  6. {  
  7. result = MessageBox::Show(this,  
  8. L"No input - enter a value.",  
  9. L"Input Error",  
  10. MessageBoxButtons::RetryCancel,  
  11. MessageBoxIcon::Error);  
  12. if(result == ::DialogResult::Retry) // If Retry button clicked  
  13. DialogResult = ::DialogResult::None;  
  14.                                 // ...prevent dialog from closing...  
  15. else // ...otherwise...  
  16. DialogResult = ::DialogResult::Cancel;// ...close the dialog.  
  17. return;  
  18. }  
  19.  
  20. int value = Int32::Parse(textBox->Text); // Get text box value  
  21. bool valid = true; // Indicator for valid entry  
  22.  
  23. for each(int n in Values) // Check input against current values  
  24. if(value == n) // If it's the same...  
  25. {  
  26. valid = false; // ...it is invalid.  
  27. break; // Exit the loop  
  28. }  
  29.  
  30. // Check limits and result of previous validity check  
  31. if(!valid || value < LowerLimit || value > UpperLimit)  
  32. {  
  33. result = MessageBox::Show(this,  
  34. L"Input not valid." +  
  35. L"Value must be from " + LowerLimit +  
  36. L" to " + UpperLimit +  
  37. L"\nand must be different from existing  
  38. values.",  
  39. L"Input Error",  
  40. MessageBoxButtons::RetryCancel,  
  41. MessageBoxIcon::Error);  
  42. if(result == ::DialogResult::Retry)  
  43. DialogResult = ::DialogResult::None;  
  44. else  
  45. DialogResult = ::DialogResult::Cancel;  
  46. }  
  47. else  
  48. Value = value; // Store the input in the property  

如果文本框的Text属性是空值或者是空字符串,则显示一个消息框。该消息框给出一条出错消息,并以Retry和Cancel按钮代替OK和Cancel。如果单击Retry,则表明用户希望再次输入,因此将对话框的DialogResult属性设置为::DialogResult::None,使其不能关闭。仅有的另一种可能性是用户单击消息框中的Cancel按钮,在这种情况下,将对话框的DialogResult属性设置为::DialogResult:: Cancel,这与单击对话框的Cancel按钮具有相同的效果。

TextBox控件的Text属性返回String^类型的句柄。通过将该句柄传递给Int32类中的静态Parse()函数,将其转换为整数。然后,将该整数与表示按钮上当前值集合的values数组中的元素进行比较。新值应该与所有其他值都不同,因此如果发现有一个当前值与新值相同,则将valid设置为false,并退出循环。

for each循环后面的if语句把几个条件OR在一起,检查valid的当前值以及新值是否超出了允许范围。如果3个表达式中的任何一个是false,整个条件就是false,于是显示一个消息框。该消息框与前一个消息框的工作方式相同,也是显示一条出错消息以及Retry和Cancel按钮。如果该数值确实是有效的,就将其存入对话框对象的Value属性中,准备供Form1对象中启动整个过程的事件处理程序检索。

4. 处理Choose菜单项的Click事件

现在,我们打算使用已经添加到UserValueDialog类的功能,完成chooseva lue_Click()处理程序函数的骨架。被右击按钮的句柄已经存储在contextButton成员中,因为首先执行的是前面添加的buttonContextMenu_Opening()处理程序。

  1. System::Void chooseva lue_Click(System::Object^ sender, System::EventArgs^ e)  
  2. {  
  3. array<int>^ values; // Array to store current button values  
  4. array<Button^>^ theButtons; // Handle to aray of buttons  
  5.  
  6. // Check if the button is in the lottoValues group box  
  7. if(lottoValues->Controls->Contains(contextButton))  
  8. {  
  9. // the button is from the lotto group...  
  10. array<Button^>buttons = {lottoValue1, lottoValue2, lottoValue3,  
  11. lottoValue4, lottoValue5, lottoValue6};  
  12. theButtons = buttons; // Store array handle at outer scope  
  13. values = GetButtonValues(buttons); // Get array of button values  
  14.  
  15. // Set up the dialog ready to be shown  
  16. userValueDialog->Values = values = GetButtonValues(buttons);  
  17. userValueDialog->LowerLimit = lottoUserMinimum;  
  18. userValueDialog->UpperLimit = lottoUserMaximum;  
  19. userValueDialog->SetLabelText(lottoUserMinimum,  
  20. lottoUserMaximum);  
  21. userValueDialog->ClearTextBox();  
  22. }  
  23. // Check if the button is in the euroValues group box  
  24. else if(euroValues->Controls->Contains(contextButton))  
  25. {  
  26. // The button is in the Values group...  
  27. array<Button^>buttons = {euroValue1, euroValue2, euroValue3,  
  28.      euroValue4, euroValue5};  
  29. theButtons = buttons; // Store array handle at outer scope  
  30. values = GetButtonValues(buttons); // Get array of button values  
  31.  
  32. // Set up the dialog ready to be shown  
  33. userValueDialog->Values = values;  
  34. userValueDialog->LowerLimit = euroUserMinimum;  
  35. userValueDialog->UpperLimit = euroUserMaximum;  
  36. userValueDialog->SetLabelText(euroUserMinimum, euroUserMaximum);  
  37. userValueDialog->ClearTextBox();  
  38. }  
  39. // Check if the button is in the euroStars group box  
  40. else if(euroStars->Controls->Contains(contextButton))  
  41. {  
  42. // The button is in the Stars group...  
  43. array<Button^>buttons = { euroStar1, euroStar2 };  
  44. theButtons = buttons; // Store array handle at outer scope  
  45. values = GetButtonValues(buttons); // Get array of button values  
  46.  
  47. // Set up the dialog ready to be shown  
  48. userValueDialog->Values = values;  
  49. userValueDialog->LowerLimit = euroStarsUserMinimum;  
  50. userValueDialog->UpperLimit = euroStarsUserMaximum;  
  51. userValueDialog->SetLabelText(euroStarsUserMinimum,  
  52. euroStarsUserMaximum);  
  53. userValueDialog->ClearTextBox();  
  54. }  
  55.  
  56. // Display the dialog  
  57. if(userValueDialog->ShowDialog(this) == ::DialogResult::OK)  
  58. {  
  59. // Determine which button value should be replaced  
  60. for(int i = 0 ; i<theButtons->Length ; i++)  
  61. if(contextButton == theButtons[i])  
  62. {  
  63. values[i] = userValueDialog->Value;  
  64. break;  
  65. }  
  66. Array::Sort(values); // Sort the values  
  67.  
  68. // Set all the button values  
  69. for(int i = 0 ; i<theButtons->Length ; i++)  
  70. theButtons[i]->Text = values[i].ToString();  
  71. }  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇22.1.14 响应上下文菜单(3) 下一篇如何更好的设置Dev C++说明

评论

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