22.1.11 添加第二个对话框(1)
添加设置Euromillions彩票极限值的第二个对话框应该很容易;该过程与添加第一个对话框的过程是相同的。按下Ctrl+Shift+A组合键,显示出Add New Item对话框,然后选择UI类别和Windows Form模板,在本项目中创建一个新的窗体,其名称应该是EuroLimitsDialog。可以采用类似于设定第一个对话框的方式设定该对话框的属性值,见表22-2。
表 22-2
|
窗 体 属 性< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
设 定 值 |
|
FormBorderStyle |
FixedDialog |
|
ControlBox |
False |
|
MinimizeBox |
False |
|
MaximizeBox |
False |
|
Text |
Set Euromillions Limits |
接下来,可以给该对话框窗体添加OK和Cancel按钮。将这两个按钮的Text属性值分别设置为OK和Cancel,将其(Name)属性值分别设置为euroOK和euroCancel。还应该将DialogResult属性值设置为OK和Cancel。定义过这两个按钮之后,可以返回到对话框窗体的属性窗口中,将AcceptButton和CancelButton属性值分别设置为euroOK和euroCancel。设置窗体的AcceptButton属性值为euroOK。
为了获得更多控件的使用经验,我们打算放弃应用程序中的一致性,不像在第一个对话框中所做的那样,使用ListBox控件来处理输入问题。在第二个对话框中,不仅需要为5个数值的那组号码提供上限和下限,还需要为两个星值的那组号码提供上限和下限。其实现不会非常雅致,但为了尽可能多地使用不同种类的控件,我们将为前者使用NumericUpDown控件,为后者使用ComboBox控件。如图22-20所示,可以给对话框窗体添加这两个控件以及相关的Label控件,并使每组控件位于一个GroupBox控件内。显然,需要首先添加GroupBox控件,然后再把其他控件放入其中。
如图22-20所示,可以设置每个Label控件的Text属性的值。标签的字体大小已经被改为9磅。为了标识每个组合框内控件的功能,上面组合框的Text属性值已经被设置为Set Values Limits,下面组合框的Text属性值是Set Stars Limits。在代码中不会访问这两个GroupBox对象,因此它们的(Name)属性值是什么并不重要。
上面组合框中的两个NumericUpDown控件的(Name)属性值应该被设置为lowerValuesLimits和upperValuesLimits。可以通过设置Maximum和Minimum属性的值,设置这两个控件显示的数值。左边lowerValuesLimits控件的Maximum和Minimum属性值应该分别是45和1,而右边upperValuesLimits控件的Maximum和Minimum属性值应该分别是49和5。可以把upperValuesLimits控件的Value属性值设置为49,这是该控件中最初显示的数值。如果还将各个NumericUpDown控件的ReadOnly属性值设置成了True,那么将禁止从键盘上输入数值。在这里对NumericUpDown控件的使用非常简单。通过设置Increment属性值,可以改变向上和向下的增量。Increment属性属于Decimal类型,因此也可以将其设置为非整数值。
可以把下面组合框中的两个ComboBox控件的(Name)属性值设置为lowerStarsLimits和upperStarsLimits。可以非常容易地输入在ComboBox中显示的数值。单击最左边ComboBox控件右上方的小箭头,显示出如图22-21所示的菜单。
|
| (点击查看大图)图 22-20 |
|
| (点击查看大图)图 22-21 |
选择该菜单底部的Edit Items菜单项,显示出如图22-22所示的String Collection Editor对话框窗口。
|
| (点击查看大图)图 22-22 |
图22-22显示出为左边的ComboBox控件输入的数值。可以为右边的ComboBox控件输入从2~9(包括2和9)的数值。
对本应用程序来说,ComboBox不是理想的控件,因为该控件不仅允许从列表中选择,还允许从键盘上输入;我们希望极限值只能从列表中选择。该控件之所以得名ComboBox,是因为它组合了ListBox控件的功能和TextBox控件的功能,前者允许从列表中选择,而后者提供文本输入功能。
1. 获得来自对话框控件的数据
从控件中取回极限值的方法基本上与处理设置Lotto彩票极限值的对话框时所用的方法相同。首先,可以给EuroLimitsDialog类添加一些新的数据成员,容纳用户设置的极限值:
- private:
- int lowerValuesLimit;
- int upperValuesLimit;
- int lowerStarsLimit;
- int upperStarsLimit;
为稳妥起见,最好在类的构造函数中初始化这些成员:
- EuroLimitsDialog(void)
- :lowerValuesLimit(1)
- ,upperValuesLimit(50)
- ,lowerStarsLimit(1)
- ,upperStarsLimit(9)
- {
- InitializeComponent();
- //
- //TODO: Add the constructor code here
- //
- }
还需要在该对话框类中定义一些公有属性,以便可以从应用程序窗口对象中访问极限值:
- public:
- property int LowerValuesLimit
- {
- int get() { return lowerValuesLimit; }
-
- void set(int limit)
- {
- lowerValuesLimit = limit;
- lowerValuesLimits->Value = limit;
- // Set as selected in NumericUpDown
- }
- }
- property int UpperValuesLimit
- {
- int get() { return upperValuesLimit; }
-
- void set(int limit)
- {
- upperValuesLimit = limit;
- upperValuesLimits->Value = limit;
- // Set as selected in NumericUpDown
- }
- }
- property int LowerStarsLimit
- {
- int get() { return lowerStarsLimit; }
-
- void set(int limit)
- {
- lowerStarsLimit = limit;
- lowerStarsLimits->SelectedItem = limit;
- // Set as selected in ComboBox
- lowerStarsLimits->SelectedIndex = // Set index for selected item
- lowerStarsLimits->FindString(limit.ToString());
- }
- }
-
- property int UpperStarsLimit
- {
- int get() { return upperStarsLimit; }
-
- void set(int limit)
- {
- upperStarsLimit = limit;
- upperStarsLimits->SelectedItem = limit;
- // Set as selected in ComboBox
- upperStarsLimits->SelectedIndex = // Set index for selected item
- upperStarsLimits->FindString(limit.ToString());
- }
- }