项目3设计制作考试系统 考试系统是现代教育技术中常用的一种考试形式。考试系统通过计算机软件生成考试题目,考生对生成的考试题目进行答卷,答卷交卷后由考试系统自动判断答题的对错,并自动给出分数。 本项目通过VB.NET设计一个简单的考试系统,该考试系统的界面如图31所示。 图31简单考试系统 简单考试系统的功能和使用流程如下: 首先是生成考试试卷; 考试界面包括“单项选择题”“多项选择题”“判断题”和“填空题”等题型,考生根据题目情况进行答题; 答完题后,单击“交卷”按钮交卷; 考试系统自动评出分数,并把分数显示出来。 本考试系统的设计重点为练习VB.NET控件的使用方法,并不涉及数据库知识,所以在考试题目设置上,采用固定的题目以及事先设定好的答案。读者可以在学习完本书后面数据库相关项目之后,自行设计数据库版本的考试系统。 任务3.1使用常用控件 简单考试系统的设计中使用了单选按钮、复选按钮以及日期、滚动条等控件。本任务中将介绍考试系统涉及的控件的创建和使用方法。 3.1.1使用RadioButton控件和GroupBox控件 考试系统的单项选择题中用到单选按钮,单选按钮可以使用RadioButton控件和GroupBox控件来实现。单选按钮的最大特点就是同一组的按钮相互排斥,每次只能选中其中的一项,如图32所示。 单选按钮RadioButton常用的属性如下。 (1) Text属性: 设置或返回控件内显示的文本。 (2) Checked属性: 设置或返回控件按钮是否被选中。值为True时,表示控件被选中; 值为False时,表示控件没有被选中。 (3) AutoCheck属性: 当该属性设置为True时,如果选择该单选按钮,将自动清除该组中的所有其他单选按钮。 单选按钮RadioButton常用的事件如下。 (1) Click事件: 当单击控件按钮时,将把控件按钮的Checked属性值设置为True,同时触发该事件。 (2) CheckedChanged事件: 当Checked属性值更改时,将触发该事件。 GroupBox控件用于为其他控件提供可识别的分组。通常,使用分组框按功能细分窗体。例如,在考试系统中,各个题目都有相应的选项,为了区分不同题目的选项,可以采用GroupBox控件进行分组区分,如图33所示。 图32RadioButton按钮 图33用GroupBox分组 GroupBox(分组)控件的常用属性如下。 Text属性: 设置或返回控件标题的文本。 接下来使用RadioButton单选按钮控件创建考试系统中的单项选择题和判断题。 新建一个VB.NET Windows应用程序,创建单项选择题。在新建的窗体中添加三个Label控件,如图34 所示,其Text属性分别为: “简单考试系统”“ 一、 单项选择题”和“1. 对于所有控件,都可以使用( )属性设置或者返回文本。”。再添加四个RadioButton控件,其Text属性分别为: “A. Text”“B. Font”“C. Name”和“D. Caption”。 图34单项选择题 添加一个Button按钮,将其Text属性设置为“交卷”。双击“交卷”按钮,添加程序如代码31所示。 代码31: “交卷”按钮的单击事件(1) Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If RadioButton1.Checked Then MessageBox.Show("答案正确!") Else MessageBox.Show("答案错误,正确答案是A!") End If End Sub 调试程序运行,选择正确答案A并单击“交卷”按钮时,显示结果如图35所示。 图35提示答案正确 选择其他错误答案时,显示结果如图36所示。 图36提示答案错误 再建立一个VB.NET Windows应用程序,创建判断题。在新创建的窗体中添加如下控件。在窗体中添加三个Label控件,其Text属性分别为“简单考试系统”“ 二、 判断题”和“1. 双击工具箱中的控件,该控件将按其默认大小添加到窗体的左上角。”。再添加两个RadioButton控件,其Text属性分别为“对”“错”。最后添加一个Button控件,其Text属性设置为“交卷”。如图37所示。 图37判断题 双击“交卷”按钮,进入代码编辑页面,添加程序如代码32所示。 代码32: “交卷”按钮的单击事件(2) Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If RadioButton1.Checked Then MessageBox.Show("正确!") Else MessageBox.Show("错误,该判断题本身题意是正确的!") End If End Sub 3.1.2使用CheckBox控件 考试系统的多项选择题中会用到复选按钮,复选按钮可以使用CheckBox控件来实现。CheckBox控件和单选按钮RadioButton控件相似的地方是,都提供给用户可以选择的项; 不同之处在于,用户可根据需要在CheckBox控件中选择其中的一项或多项,如图38所示。 复选按钮CheckBox控件常用的属性如下。 (1) Text属性: 设置或返回控件内显示的文本。 (2) Checked属性: 设置或返回控件按钮是否被选中。 复选按钮CheckBox控件最常用的事件如下。 (1) Click事件: 当单击控件按钮时,将把控件按钮的Checked属性值设置为True,同时触发该事件。 (2) CheckedChanged事件: 当Checked属性值更改时,将触发该事件。 接下来使用复选按钮CheckBox控件创建考试系统中的多项选择题。 新建一个VB.NET Windows应用程序,创建多项选择题。在新建的窗体中添加如下控件。首先添加三个Label控件,其Text属性分别为“简单考试系统”“ 一、 多项选择题”和“1. 对于显示图像的控件,都可以使用( )方法设置图像。”。然后添加四个CheckBox控件,其Text属性分别为“A. 设置Image属性”“ B. 设置BackGroundImage属性”“C. 编程”和“D. 设置Text属性”。最后添加一个Button控件,其Text属性设置为“交卷”,如图39所示。 图38CheckBox控件 图39多项选择题(1) 双击“交卷”按钮,在其单击事件中添加程序如代码33所示。 代码33: “交卷”按钮的单击事件 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If CheckBox1.Checked And CheckBox2.Checked And CheckBox3.Checked And Not CheckBox4.Checked Then MessageBox.Show("答案正确!") Else MessageBox.Show("答案错误,正确答案是ABC") End If End Sub 调试程序运行,选择正确答案并单击“交卷”按钮时,显示结果如图310和图311所示。 图310多项选择题(2) 图311提示答案正确 当选择其他答案时,显示结果如图312所示。 图312提示答案错误 3.1.3使用日期控件 用于显示月历和日期的控件常用的有两个,分别是MonthCalendar(月历)控件和DateTimePicker(日期选择框)控件,这两个控件的外观如图313所示。 图313月历和日期控件 接下来用月历和日期控件来设计一个简单的程序,程序中用户可以使用三种控件(分别是单选按钮、月历控件和日期选择控件)来选择日期,并形成这三种控件的互动。操作步骤如下。 新建一个VB.NET Windows应用程序。在新建的窗体中添加一个GroupBox控件,更改它的Text属性为“选择月份”。在该GroupBox控件上添加12个RadioButton单选按钮控件,把它们的Text属性分别设置为“一月”“二月”……“十二月”。然后添加一个MonthCalendar控件和一个DateTimePicker控件,如图314所示。 接下来进入该程序的代码编辑页面,首先在Form1的类定义中添加程序如代码34所示。 代码34: changemonth()方法 Private Sub changemonth(ByVal month As Integer) If month = 1 And month = 12 Then Dim newdate As New DateTime(DateTimePicker1.Value.Year, month, 1) DateTimePicker1.Value = newdate MonthCalendar1.SelectionStart = newdate MonthCalendar1.SelectionEnd = newdate.AddDays(3) End If End Sub 图314日期控件应用程序 此段程序中,关键语句Dim newdate As New DateTime(DateTimePicker1.Value.Year, month, 1)中,DateTimePicker1.Value.Year的含义是,返回日期选择控件默认显示的年份。该语句定义了一个变量newdate,它的值是DateTime日期类型的。 添加这部分代码之后,接下来对12个单选按钮添加事件,分别单击每个单选按钮控件。 在第1个单选按钮事件中添加如下代码。 changemonth(1) 在第2个单选按钮事件中添加如下代码。 changemonth(2) … 在第12个单选按钮事件中添加如下代码。 changemonth(12) 在添加完12个单选按钮事件之后,双击DateTimePicker控件,在该事件中添加如下代码。 Monthcalendar1.todaydate=datetimepicker1.value 该条语句的含义是,设置月历控件“今天”的时间是日期选择控件所选择的日期。 添加完代码之后,编译、运行该程序并测试,选择左边单选按钮控件对应的月份,则右边日期月历控件和日期选择控件会显示对应的月份,并且在月历控件中会显示对应的日期选择范围; 使用日期选择控件选择日期,月历控件的当前日期会随之改变。程序运行效果如图315所示。 图315程序运行后的效果 3.1.4使用滚动条控件 滚动条是Windows应用程序中常用的控件。滚动条包括水平滚动条和垂直滚动条两种。在VB.NET中,可以使用水平滚动条控件HScrollBar和垂直滚动条控件VScrollBar来实现滚动条效果。 ScrollBar控件常用的属性如下。 (1) MiniMum属性: 指定滚动范围的下限。 (2) MaxMum属性: 指定滚动范围的上限。 (3) Value属性: 表示滚动框在滚动条中的当前位置。 ScrollBar控件常用的事件如下。 Scroll事件: 不论是水平滚动条还是垂直滚动条,在用户单击上下(或左右)按钮、移动滚动条或者单击滚动条空白区时,都会产生一个Scroll事件。对滚动条的编程,主要就是围绕Scroll事件展开的。 接下来我们使用滚动条来设计一个图片浏览器,实现图片的滚动浏览。在这个程序中,我们使用了图片框控件PictureBox。 PictureBox控件是用来在窗体上显示图片的控件,它可以显示包括位图、元文件、图标、JPEG、GIF或PNG等格式的图片,功能非常强大。 PictureBox控件的常用属性如下。 (1) Image属性: 指定为要显示的Image对象。 (2) SizeMode属性: 该属性有4种可能的取值。当该属性值为PictureBoxSizeMode.AutoSize时,使PictureBox的大小自动地等于其所显示的图片的大小; 当该属性值为PictureBoxSizeMode.CenterImage时,使图片居中显示,如果图片比PictureBox大,则不显示外边缘; 当该属性值为PictureBoxSizeMode.Normal时,调整图片的大小,以使其位于PictureBox的左上角,若图片比PictureBox大,则裁掉其余部分; 当该属性值为PictureBoxSizeMode.StretchImage时,为调整图片的大小,以使其正好充满PictureBox。 建立一个VB.NET Windows应用程序,在新建的窗体中添加两个PictureBox(图片框)控件(其中picturebox1范围大,picturebox2在picturebox1里边)。再添加一个水平滚动条控件HScrollBar和一个垂直滚动条控件VScrollBar。为picturebox2的image属性指定一幅图片,单击图片控件picturebox2的image属性栏中的省略号,在弹出的文件选择框中选择一幅图片。 注意,图片尺寸要大一些,否则滚动条就不会起作用了。设计界面如图316所示。 图316设计界面 然后双击窗体的空白区域(没有任何控件的地方),进入代码编辑页面的Form1_Load事件中,添加程序如代码35所示。 代码35: Form1Load事件 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load PictureBox1.Controls.Add(PictureBox2) PictureBox2.Left = 0 PictureBox2.Top = 0 PictureBox2.SizeMode = PictureBoxSizeMode.AutoSize VScrollBar1.Maximum = PictureBox2.Height - PictureBox1.Height HScrollBar1.Maximum = PictureBox2.Width - PictureBox1.Width End Sub 接下来添加滚动条代码。双击垂直滚动条,在该滚动条的事件中添加程序如代码36所示。 代码36: VScrollBar1Scroll事件 Private Sub VScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles VScrollBar1.Scroll PictureBox2.Top = -(VScrollBar1.Value) End Sub 双击水平滚动条,在该滚动条的事件中添加程序如代码37所示。 代码37: HScrollBar1Scroll事件 Private Sub HScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.