第六讲窗体、控件和组件2.ppt
第六讲,窗体、控件和组件,2,回顾,属性通过使用访问器读写类中的字段,对字段进行保护。属性分为以下三种不同的类型:读/写属性只读属性只写属性可以在类中定义索引器,允许使用下标对该类对象中的数据进行访问索引器必须总是命名为 this,因为对它们的访问是通过其所属的对象进行的委托包含对方法而不是方法名称的引用C#中的事件允许一个对象将发生的事件或修改通知其他对象,第6章 窗体、控件和组件,6.1 窗体与对话框6.2 控件共有的基本操作6.3 容器类控件和组件6.4 文本操作类控件6.5 选择操作类控件6.6 图像操作类控件和组件6.7 菜单、工具栏与状态栏6.8 视图操作类控件6.9 其他常用控件,4,目标,理解 Windows 窗体使用基本控件如标签、文本、按钮、列表框和组合框掌握窗体的常用属性和方法,5,简介 3-1,GUI界面,6,简介 3-2,各种控件,属性,放置控件的区域,7,简介 3-3,WinForms应用程序可能存在多个窗体,用于获取用户输入的数据和向用户显示数据,System.Windows.Forms,简单而强大 改善了接口和基类 IntelliSense 新的管理数据提供程序 安全 灵活的控件 通晓数据 向导,8,创建 WinForms应用程序 6-1,“开始”“程序”“Microsoft Visual Studio.NET 2003”“Microsoft Visual Studio.NET 2003”,9,创建 WinForms应用程序 6-2,设计窗口,10,创建 WinForms应用程序 6-3,using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;namespace SampleProject/Form1 的摘要说明。/public class Form1:System.Windows.Forms.Form/必需的设计器变量./,提供了大量绘图工具的访问权限,基础核心命名空间,ArrayList、BitArray、Hashtable、Stack、StringCollection 和 StringTable 类,大量窗体和控件,从 System.Windows.Forms.Form 派生,Visual Studio.NET 生成的代码,11,创建 WinForms应用程序 6-4,private System.ComponentModel.Container components=null;public Form1()/Windows 窗体设计器支持所必需的/InitializeComponent();/TODO:在 InitializeComponent 调用之后添加任何构造函数代码/,构造函数调用 InitializeComponent()方法,private void InitializeComponent()ponents=new System.ComponentModel.Container();this.Size=new System.Drawing.Size(300,300);this.Text=Form1;,项目的容器,12,创建 WinForms应用程序 6-5,/清理所有正在使用的资源。/protected override void Dispose(bool disposing)if(disposing)if(components!=null)components.Dispose();base.Dispose(disposing);,释放系统资源,13,创建 WinForms应用程序 6-6,STAThreadstatic void Main()Application.Run(new Form1();,程序的主入口点,14,WinForms 中的常用控件 2-1,可视化界面组件统称为控件,System.Windows.Forms.Control,6.1 窗体与对话框,1、窗体应用程序的启动和停止使用Application类提供的静态方法来启动、停止应用程序。Application类提供的方法:Run方法:用于在当前线程上启动应用程序消息循环,并显示窗体。Exit方法:用于停止消息循环。DoEvents方法:用于在程序处于某个循环中时处理消息。,6.1.2 窗体的创建、显示与隐藏,1、如何在代码中打开一个新窗体 Form2 fm=new Form2();fm.Show();/或者fm.ShowDialog();2、如何在代码中关闭一个窗体 用法1:fm.Close();用法2:this.Close();用法3:Application.OpenFormsForm1.Close();3、如何隐藏一个打开的窗体(1)隐藏当前窗体:this.Hide();(2)隐藏其它窗体:Application.OpenFormsForm1.Hide();4、如何重新显示隐藏的窗体(1)显示当前窗体:this.Show();(2)显示其它窗体:Application.OpenFormsForm1.Show();,17,窗体容器简介 2-1,图标,系统按钮,标题栏,控件,18,窗体容器简介 2-2,SDI 单文档界面 MDI 多文档界面 模式窗口,19,显示另一窗体,被调用的窗体类 窗体实例=new 被调用的窗体类();,窗体实例.Show();,private void cmdShow_Click(object sender,System.EventArgs e)frmA A=new frmA();A.Show();,6.1.2 窗体的创建、显示与隐藏,【例6-1】演示窗体的基本用法以及如何显示和关闭窗体。部分运行效果如图:,6.1.3 窗体常用的属性,常用属性:Name:获取或设置窗体的名称,代码中通过该属性来访问窗体。BackColor:获取或设置窗体的背景色。ForeColor:获取或设置窗体上文本的前景色。Location:获取或设置以屏幕坐标表示的代表窗体左上角的坐标位置。Size:指定窗体的高度和宽度。Text:设置控件上所要显示的文本,如标签、按钮和复选框等控件上的文字。,22,窗体的常用方法和事件,窗体常用的属性和外观控制,StartPostion:获取或设置运行时窗体的起始位置,一般在构造函数中设置此属性。例如:this.StartPosition=FormStartPosition.Manual;this.Location=new Point(screenX,screenY);通过设置窗体的【ControlBox】属性为“True”或者“False”,可以控制是否显示最大化、最小化以及关闭按钮。除此之外,还可以通过设置窗体的【FormBorderStyle】属性控制窗体的边框样式。,6.1.4 窗体位置及外观控制,【例6-2】演示如何控制窗体的显示位置以及如何控制窗体的外观形状。设计视图如下:,运行效果如下:,6.1.5 单文档窗体和多文档窗体,Windows的窗体分为单文档窗体和多文档窗体。多文档窗体(Multi-Document Interface,MDI)是指在一个主窗体中可以包含一个或多个子窗体的窗体,主窗体称为MDI父窗体,子窗体称为MDI子窗体。,6.1.5 单文档窗体和多文档窗体,【例6-3】演示MDI窗体的基本用法以及如何显示和关闭子窗体。,6.1.6 对话框,对话框用于与用户交互和检索信息。对话框分为标准对话框和自定义对话框。1MessageBox对话框 调用MessageBox类的静态Show方法来显示消息对话框。返回值是MessageBoxResult枚举的值,其中每个值都等同于消息对话框可以显示的按钮之一。Show方法提供了多种重载形式,常用的重载形式有:public static DialogResult Show(string text)public static DialogResult Show(string text,string caption)public static DialogResult Show(string text,string caption,MessageBoxButtons buttons,MessageBoxIcon icon),6.1.6 对话框,Text:在消息框中显示的文本。caption:在消息框的标题栏中显示的文本。buttons:MessageBoxButtons枚举值之一,指定在消息框中显示哪些按钮。枚举值有OK、OKCancel、YesNoCancel和YesNo。icon:MessageBoxIcon枚举值之一,指定在消息框中显示哪个图标。枚举值有None(不显示图标)、Hand(手形)、Question(问号)、Exclamation(感叹号)、Asterisk(星号)、Stop(停止)、Error(错误)、Warning(警告)和Information(信息)。Show方法的返回值是DialogResult枚举值之一。DialogResult枚举值有:None(消息框未返回值)、OK、Cancel、Yes和No。,通用对话框,OpenFileDialogSaveFileDialogPrintDialogFontDialogColorDialog,6.1.6 对话框,6.1.6 对话框,2.ColorDialog:提供颜色选择。方法:ShowDialog()返回值:DialogResult类型3.FontDialog:提供字体选择。方法:ShowDialog()返回值:DialogResult类型用法如下:ColorDialog colorDlg=new ColorDialog();if(colorDlg.ShowDialog()=DialogResult.OK)textBox1.ForeColor=colorDlg.Color;,6.1.6 对话框,自定义窗体对话框的设计方法与设计一般窗体基本相同,不同之处是还要对自定义窗体对话框作如下处理:将窗体的【FormBorderStyle】属性更改为“FixedDialog”。将窗体的【MaximizeBox】属性、【MinimizeBox】属性和【ControlBox】属性设置为“False”。在窗体上放一个“确定”按钮,一个“取消”按钮。然后将窗体的【AcceptButton】属性设置为“确定”按钮,【CancelButton】属性设置为“取消”按钮。在按钮事件中,设置DialogResult类型的返回值,以便让对话框隐藏起来。,6.1.6 对话框,【例6-4】自定义窗体对话框的用法。设计视图如下:,运行效果如下:,6.2 控件共有的基本操作,6.2.1 控件中常用的属性和方法1.常用基本属性 除了书上讲的属性外,注意以下属性的用法:1)(Name):指定控件的名称,它是控件在当前应用程序中的唯一标识,代码通过该属性来访问控件2)Enabled:决定控件是否可用,取值为true时可用,取值为false时不可用3)Anchor属性:保持控件与边框的距离不变4)Dock属性:让控件始终紧靠边框,6.2.1 控件中常用的属性和方法,2.将窗体中控件的背景色设置为“Transparent”,则该控件相对于其父容器是透明的。【例6-5】将图像和文字叠加在同一幅背景图上,让其看起来像是一幅图。,未设置BackColor属性时的设计界面 设置BackColor属性后的界面效果,6.2.1 控件中常用的属性和方法,3.按住键同时选中多个控件,然后利用“布局”快捷工具栏中的快捷方式可以快速让各控件对齐。4.利用布局工具栏中的“键顺序”按钮,可以在设计界面下调整焦点顺序。,6.2.2 控件的锚定和停靠,1Anchor属性【Anchor】属性定义控件的定位点位置。当控件锚定到某个窗体时,如果用户调整该窗体的大小,该控件将维持它与定位点位置之间的距离不变。2.Dock属性【Dock】属性的用途是使控件与窗体边缘对齐。此属性指定控件在窗体中的驻留位置。【Dock】属性设置为下列值:Left停靠到窗体的左侧。Right停靠到窗体的右侧。Top停靠到窗体的顶部。Bottom停靠到窗体底部。Fill占据窗体中的所有剩余空间。None不在任何位置停靠,它显示在由Location属性指定的位置。,6.2.3 常用的鼠标事件和键盘事件,1.鼠标事件Click 单击鼠标左键时触发MouseDoubleClick 双击鼠标左键时触发MouseEnter 鼠标进入控件可见区域时触发MouseMove 鼠标在控件区域内移动时触发MouseLeave 鼠标离开控件可见区域时触发2.键盘事件KeyDown 按下键盘上某个键时触发KeyUp 释放键盘上的按键时触发KeyPress 在KeyDown之后KeyUp之前触发,非字符键不会触发该事件。,6.2.3 常用的鼠标事件和键盘事件,【例6-6】演示鼠标和键盘事件的触发条件,触发顺序,并显示各个事件所传递的参数内容。设计界面如下:,40,WinForms 中的常用控件 2-2,标签,按钮,组合框,列表框,文本框,41,标签,TextBox属性/方法,TextBox 控件允许用户在应用程序中输入文本。此控件具有标准 Windows 文本框控件所没有的附加功能,包括多行编辑和密码字符屏蔽。可以使用 Multiline 和 ScrollBars 属性,从而能够显示或输入多行文本。通过将 MaxLength 属性设置为一个特定的字符数,可以限制输入到 TextBox 控件中的文本数量。使用 PasswordChar 属性屏蔽在控件的单行版本中输入的字符。,43,文本框,44,按钮,45,列表框,46,使用列表框,private void frmUserAdd_Load(object sender,System.EventArgs e)this.lstCurrDeptName.Items.Add(软件部);this.lstCurrDeptName.Items.Add(硬件部);this.lstCurrDeptName.Items.Add(财务部);this.lstCurrDeptName.Items.Add(人事部);,private void cmdOK_Click(object sender,System.EventArgs e)/注意SelectedIndex的值,第一个应该为0if(this.lstCurrDeptName.SelectedIndex=0)MessageBox.Show(this.lstCurrDeptName.Text+已经选择上.,当前选择的值);,47,组合框,48,使用组合框,private void frmUserAdd_Load(object sender,System.EventArgs e)this.cboDesig.Items.Add(总裁);this.cboDesig.Items.Add(副总裁);this.cboDesig.Items.Add(首席执行官);this.cboDesig.Items.Add(经理);/默认的选择是产品部this.cboDesig.SelectedIndex=1;,private void cboDesig_SelectedIndexChanged(object sender,System.EventArgs e)MessageBox.Show(选择的是第“+(this.cboDesig.SelectedIndex+1).ToString(),选择的信息);MessageBox.Show(选择的职务是“+this.cboDesig.Text,选择的信息);,49,消息框窗口 2-1,MessageBox.Show(“消息文本);,消息框用于显示消息,Abort,Cancel,Ignore,No,None,Ok,Retry 和 Yes,if(MessageBox.Show(“保存文件”,“保存,MessageBoxButtons.YesNo,MessageBoxIcon.Information,MessageBoxDefaultButton.Button1)=DialogResult.Yes)/保存文件所用的代码/保存后的 MessageBox,50,消息框窗口 2-2,51,应用程序示例 3-1,解决方案资源管理器,属性窗口,工具箱,52,应用程序示例 3-2,private void btnAdd_Click(object sender,System.EventArgs e),private void btnAdd_Click(object sender,System.EventArgs e)this.txtEmpName.Enabled=true;this.txtAddress.Enabled=true;this.cboDesignation.Enabled=true;this.lstCurrDeptName.Enabled=true;,private void btnCancel_Click(object sender,System.EventArgs e)this.txtEmpName.Text=;this.txtAddress.Text=;this.cboDesignation.Text=“经理;,private void btnExit_Click(object sender,System.EventArgs e)string str=;for(int ctr=0;ctr=this.lstCurrDeptName.SelectedItems.Count-1;ctr+)str+=n+this.lstCurrDeptName.SelectedItemsctr.ToString();MessageBox.Show(“选定的项目为n+str);Application.Exit();,53,应用程序示例 3-3,private void cboDesignation_SelectedIndexChanged(object sender,System.EventArgs e)MessageBox.Show(“您已经选定了+this.cboDesignation.SelectedItem.ToString();,在退出应用程序之前,使用 MessageBox.Show()显示在 str 变量中存储选定项的消息框,54,应用程序示例 6-1,单击“发送”按钮,55,应用程序示例 6-2,56,应用程序示例 6-3,private void frmFeedBack_Load(object sender,System.EventArgs e)this.cboSubject.Items.Add(“一般反馈);this.cboSubject.Items.Add(“设计反馈);this.cboSubject.Items.Add(“颜色反馈);this.cboSubject.Items.Add(“字体反馈);private void btnSend_Click(object sender,System.EventArgs e)frmUserDetails objfrmUserDetails=new frmUserDetails(this.txtName.Text,this.txtEmailId.Text,this.cboSubject.SelectedItem.ToString(),this.txtFeedback.Text);objfrmUserDetails.Show();,57,应用程序示例 6-4,private void btnClose_Click(object sender,System.EventArgs e)this.Close();private void frmFeedBack_Closed(object sender,System.EventArgs e)MessageBox.Show(“感谢您输入的反馈!);,58,应用程序示例 6-5,public class frmUserDetails:System.Windows.Forms.Formprivate string _name;private string _emailId;private string _subject;private string _feedBack;,59,应用程序示例 6-6,public frmUserDetails(string varName,string varEmail,string varSubject,string varFeedBack)InitializeComponent();/在 private 变量中存储值 this._name=varName;this._emailId=varEmail;this._subject=varSubject;this._feedBack=varFeedBack;/在列表框中放置值 this.lstValues.Items.Add(this._name);this.lstValues.Items.Add(this._emailId);this.lstValues.Items.Add(this._subject);this.lstValues.Items.Add(this._feedBack);,6.3 容器类控件和常用控件,1、分组控件 Panel控件和GroupBox控件用于对不同的控件进行分组。Panel控件不显示标题但可以有滚动条,而GroupBox可显示标题,不显示滚动条。2、工具提示控件(ToolTip)ToolTip组件用于在用户指向控件时显示相应的提示信息。3、错误提示组件(ErrorProvider)ErrorProvider组件可以对窗体或控件上的用户输入进行验证。4、Timer组件:主要用于设置某个时间间隔,并在每次到达设置的时间间隔时,触发指定的事件。该组件常用的属性是【Enabled】属性和【Interval】属性。,Timer控件,【例6-7】利用Timer组件和Label控件,在窗体上方显示类似电影字幕的不停向上滚动的文本,并在窗体下方显示一个简单的时钟信息。左图为设计界面,右图为运行效果。,6.4 文本类操作控件,标签类控件(Label、LinkLabel)操作控件包括:1、Label:用于提供控件或窗体的描述性文字,以便为用户提供相应的信息。常用属性:Text属性。2、LinkLabel:与Label控件的作用非常相似,不同的是LinkLabel控件以超链接的形式显示文本信息。当用户单击LinkLabel控件时,会触发LinkClicked事件。可以在LinkClicked事件中编写代码让其链接到指定的网页。,6.4.2 文本操作类控件,1.文本框(TextBox)控件常用的基本属性1)Text:表示文本框中显示的内容。2)MaxLength:表示用户可以在文本框控件中最多键入的字符数,默认值为32767个字符。注意,由于使用的是Unicode字符,所以对中文和英文的字符计数方法是相同的,即一个英文字符的长度为1,一个汉字字符的长度也是1。3)Multiline:表示是否可以包含多行内容。4)PasswordChar:用于指定在屏蔽TextBox控件中输入的密码字符时所要使用的符号。2.TextBox控件常用的基本事件 TextChanged:表示文本框中的当前内容(Text属性值)更改时触发的操作。,6.4.2 文本操作类控件,2.MaskedTextBox:掩码文本框。它的主要作用是控制输入文本的格式。如果输入的内容不满足规定的格式,则拒绝用户输入。常用属性【Mask】属性,用于设置当前掩码文本框输入字符的格式。3.RichTextBox:主要功能是进行高级文本输入和编辑,作为一般的文本输入,其属性、事件与TextBox控件的属性、事件大致相同。,6.4.2 文本操作类控件,【例6-8】演示TextBox控件、ToolTip组件和ErrorProvider组件的用法。设计界面如下:,6.5 选择类控件,1、列表类控件(ListBox控件、ComboBox控件)ListBox(列表框)控件和ComboBox(下拉框)控件均用于显示一组条目,以便操作者从中选择一条或者多条信息,并对其进行相应的处理。这两个控件常用的属性和方法ItemsSelectedIndex、SelectedItemSelectedItemsItems.AddItems.AddRangeItems.Remove、Items.RemoveAtItems.Clear,6.5.1 选择类控件,1、ListBox控件的其他属性MutiColumn属性:决定是否可以以多列的形式显示各项。SelectionMode属性:选择列表项的方式。HorizontalScrollbar属性:获取或设置一个值(true或者false),该值指示是否在控件中显示水平滚动条。2、ComboBox控件的其他属性DropDownStyle属性:表示组合框的显示样式,它有3种选择形式。MaxDropDownItems属性:设置打开列表框时所显示的最大条目数。,6.5.1 选择类控件,【例6-9】设计一个简单的选修课程修改界面,从可选项中选择课程添加到选修的课程列表内。如果可选项中没有提供所选课程,允许用户直接键入新课程,并自动将键入的新课程添加到供选择的课程中。设计界面如下:,6.5.2 复选框控件,CheckBox控件1.三种状态2.常用属性 Checked属性3.常用事件 CheckedChanged事件,CheckBox控件,【例6-10】设计一个窗体,让用户选择球类参赛项目,要求用一个复选框表示是否参加所有比赛项目,如果只参加了部分球赛项目,该复选框用“不确定”状态表示。设计界面如下:,6.5.2 CheckedListBox控件,常用属性(1)Items属性:项的集合。(2)Count属性:项的数目。(3)CheckedItems属性:获取选中项的集合。(4)CheckedIndices属性:获取选中项索引的集合。(4)MultiColumn属性:true或false。常用事件:SelectedIndexChanged事件。常用方法:(1)GetItemChecked方法:获取指定项是否被选中。(2)SetItemChecked方法:设置某个复选框的选中状态。,CheckedListBox控件,【例6-11】设计一个简单的课程选择界面,演示CheckedListBox控件的用法。左图为设计界面,右图为运行效果。,6.5.3 RadioButton控件,1.特点:(1)单选(2)以各自所在的容器来划分组,如果在一个窗体上创建多个单选按钮组,可以使用GroupBox或者Panel控件作为容器。2.与CheckBox相比,RadioButton控件除了是单选外,其他用法与CheckBox用法相同。,74,单选按钮,Windows 窗体单选按钮控件以组的形式使用单选按钮允许用户从多个选项中选择一个选项,6.5.3 RadioButton控件,【例6-12】演示RadioButton控件的用法。设计界面如下:,6.5.4 日期选择控件,1.DateTimePicker控件用于对日期(年月日)和时间(时分秒)进行处理,该控件提供一个可选择的日期范围,供用户选择/编辑日期或时间。2.常用属性1)Text属性2)Value属性3)Format属性 4)ShowUpDown属性 5)CustomFormat属性3、如果希望利用该控件仅让用户编辑时间(时分秒),需要将它的【ShowUpDown】属性设置为“True”,并将其【Format】属性设置为“Time”。也可以利用该控件显示并让用户编辑日期和时间,此时需要将其【Format】属性设置为“Custom”,并设置其【CustomFormat】属性指定日期时间格式字符串。,6.5.4 日期选择控件,【例6-13】演示DateTimePicker控件的用法。,设计界面如下:,运行界面如下:,6.6 图像操作类控件,PictureBox控件:显示图片。1.常用属性 1)Image:获取或设置显示的图像 2)SizeMode:AutoSize、CenterImage、Normal、StretchImage、Zoom 3)Parent:(仅代码方式下可用):获取或设置父级控件2.加载和清除图片/加载图片if(pictureBox1.Image!=null)pictureBox1.Image.Dispose();string fileName=Application.StartupPath+MyImage.gif;pictureBox1.Image=Image.FromFile(fileName);/清除图片if(pictureBox1.Image!=null)pictureBox1.Image.Dispose();pictureBox1.Image=null;,79,图片框,图片框控件表示可用于显示图像的 Windows 图片框控件,显示位图、元文件、图标、JPEG、GIF 或 PNG 等格式的图形,是一种图形显示控件,图片框,PictureBox控件,【例6-14】演示如何将图像拖放到RichTextBox控件内。,设计界面 运行界面,6.6 图像操作类控件,ImageList控件:图像列表控件。1.ImageList组件用于保存一组图像,然后供其他控件显示一组图像中的某一个图像,例如 ListView控件、TreeView控件等。2.常用属性:ImageList组件的主要属性是【Images】属性,它包含关联的控件将要使用的图片。每个单独的图像可通过其索引值或其键值来访问,其中索引值用【ImageIndex】属性来设置,键值用【ImageKey】属性来设置。,ImageList控件,【例6-15】演示如何利用ImageList组件动态改变按钮图像的状态。运行效果如下:,83,选项卡控件,在 Windows 应用程序中,选项卡用于将相关的控件集中在一起,放在一个页面中选项卡控件用于显示多个选项卡,其中每个选项卡均可包含图片和其他控件选项卡相当于另一个窗体,可以容纳其他控件,选项卡控件,84,选项卡控件的属性,85,选项卡控件的事件,86,滚动条,用于上下或者左右滚动整个窗口或者文档在 Microsoft Word 或 Excel 中,为浏览多页面的文档提供了滚动条,滚动条,垂直滚动条,水平滚动条,带有滚动条的 MS Word 文档窗口,滚动条的属性和事件如下:,87,进度条,用于指示操作的进度、完成的百分比外观是排列在水平条中的一定数目的矩形,88,进度条的属性和方法,89,应用程序示例 9-1,使用窗体接受职员的个人信息和职业信息将使用单选按钮、图片框和选项卡控件应用程序提供有两个选项卡页第一个选项卡页显示个人信息的文本框,90,应用程序示例 9-2,第二个选项卡页显示职员信息的文本框,91,应用程序示例 9-3,新建一个 Windows 应用程序,并将其命名为 EmployeeForm单击“视图”“解决方案资源管理器”将 Form1.cs 文件更改为 frmEmployees.cs单击“视图”“属性”将窗体的 Name 属性更改为 frmEmployee,并将 Text 属性更改为职员申请表单击“视图”“工具箱”以调用工具箱窗口在窗体中添加一个选项卡控件按以下幻灯片所示更改属性,92,应用程序示例 9-4,tabPersonal 选项卡页,tabProfessional 选项卡页:,93,应用程序示例 9-5,在“下一步”按钮的 Click 事件中添加以下代码,private void btnNext_Click(object sender,System.EventArgs e)if(tabMain.SelectedIndex=0)vsbPersonal.Visible=false;tabMain.SelectedIndex=1;,在选项卡控件的 Click 事件中编写以下代码。,private void tabMain_Click(object sender,System.EventArgs e)if(tabMain.SelectedIndex=0)vsbPersonal.Visible=false;tabMain.SelectedIndex=1;else if(tabMain.SelectedIndex=1)vsbPersonal.Visible=true;tabMain.SelectedIndex=0;,在选项卡之间导航,94,应用程序示例 9-6,在“上一步”按钮的 Click 事件中添加以下代码,private void btnBack_Click(object sender,System.EventArgs e)if(tabMain.SelectedIndex=1)vsbPersonal.Visible=true;tabMain.SelectedIndex=0;,在“完成”按钮中添加以下代码,private void btnDone_Click(object sender,System.EventArgs e)MessageBox.Show(“感谢您输入信息”,“信息);Application.Exit();,95,在垂直滚动条的 Scroll 事件中编写以下代码,private void vsbPersonal_Scroll(object sender,System.Windows.Forms.ScrollEventArgs e)vAbsPos=(float)(vsbPersonal.Value-vsbPersonal.Minimum);SetVerticalScrollMultiplier(grpGeneral);/检查滚动方向是自上往下还是自下往上if(vsbPersonal.Value oldValue)grpGeneral.Top=grpGeneral.Top-(int)(vScrollMultiplier*vAbsPos);picLogo.Top=picLogo.Top-(int)(vScrollMultiplier*vAbsPos);grpGender.Top=grpGender.Top-(int)(vScrollMultiplier*vAbsPos);,应用程序示例 9-7,检查滚动方向,96,应用程序示例 9-8,btnNext.Top=btnNext.Top-(int)(vScrollMultiplier*vAbsPos);elseif(vsbPersonal.Value oldValue)grpGeneral.Top=grpGeneral.Top+(int)(vScrollMultiplier*vAbsPos);picLogo.Top=picLogo.Top+(int)(vScrollMultiplier*vAbsPos);grpGender.Top=grpGender.Top+(int)(vScrollMultiplier*vAbsPos);btnNext.Top=btnNext.Top+(int)(vScrollMultiplier*vAbsPos);oldValue=vsbPersonal.Value;,检查滚动方向(续),97,应用程序示例 9-9,编写以下自定义方法以便计算垂直滚动量,private void SetVerticalScrollMultiplier(Control ctrl)float hsb=(float)(vsbPersonal.Height-ctrl.Height);float ticks=(float