资源描述:
《第04章 顺序结构程序设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
第4章顺序结构程序设计C#采用完全面向对象的程序设计方法,它尽管采用了事件驱动的机制,但在设计程序代码时,对于具体的代码块仍涉及流程控制问题。可以说,面向对象的程序设计方法包容了面向过程的结构化程序设计方法,将其作为代码块设计的方法。也可以说,结构化程序设计方法在面向过程的程序设计中是一种全局的方法,而在面向对象的程序设计中,只是一种局部的方法。结构化程序设计方法把程序的结构规定为顺序、选择和循环三种基本结构。尽量避免语句间的跳转,设计时要求自顶向下、逐步求精、模块化程序设计等设计原则。其目的是为了解决团队开发大型软件时,如何实现高效率、高可靠性的问题。目前程序的可读性好、可维护性好已成为评价程序质量的首要标准。顺序结构是程序设计中最简单、最常用的基本结构。在该结构中,各语句的执行是按照各语句书写次序一条接一条地顺序执行,是其他结构的基础。在选择结构和循环结构中,也总是以顺序结构作为其最终的子结构。4.1赋值语句在一个程序中,处理数据是最基本的操作,因此,最基本的语句之一是赋值语句。通过赋值语句,程序可以完成最基本的数据临时存储的操作。C#中的赋值语句是由赋值表达式构成的。由于C#提供了丰富的赋值表达式形式,因此,赋值语句也表现出多样性。4.1.1单赋值语句由一个赋值操作符构成的赋值语句。其格式为:变量=表达式;说明:①“变量”是被赋值的对象,变量可以是基本变量、结构变量、枚举变量、对象变量等。特别要注意的是,不能将符号常量当作被赋值的对象,符号常量虽然形同变量,但它是某一常量值的表示形式,是不允许被修改的。例如:doubleP=3.1415926;//声明一个双精度型的变量P,并初始化constdoublePI=3.1415926;//声明一个双精度型的符号常量P=3.14;//正确,变量的值是可以改变的PI=3.14;//错误,常量的值不允许改变②“表达式”可以是单个的变量、常量,因为单个的变量与常量是表达式的特殊形式。③“=”称为“赋值号”,功能是把“表达式”的值赋给“变量” 16 ,而且是先计算再赋值。赋值号不是数学意义上的等号,正如前面章节中介绍的,数学意义上的等号在C#中使用连续的两个等号“==”表示。赋值号与数学意义上的等号之间的差别见表4-1。表4-1赋值号与数学等号的差别类别表达式说明数学等号a=3表示变量a的值与3相等赋值号a=3表示将数值3赋给变量a数学等号a=a+1错误!等号两边不相等赋值号a=a+1正确!表示将a的值加1,运算结果赋给a④必须注意,赋值号两端的数据类型原则上应该一致,否则系统将自动进行数据类型的转换,可能会带来一些不可预料的后果。例如:myName="张三";//将字符串常量赋值给字符串变量myNameTotal=10;//将常量100赋值给数值变量TotalSum=10*Total;//'将表达式10*Total的值赋给数值变量Label1.Text=myName;//将字符串变量myName赋值给对象的属性变量Text1.Text=Text2.Text;//将对象的属性值赋值给另一对象的属性变量从上面的例子可以看出一般的赋值语句都比较简单,但对象赋值可能抽象一些。对象赋值有两种情况,一种是给对象的属性赋值,即改变对象的属性值,这种赋值本质上与基本变量的赋值是相同的,一种是对象整体赋值,这种赋值属于引用赋值,关于引用类型,将在后面的相关章节中介绍。4.1.2复合赋值语句与连续赋值语句复合赋值语句与连续赋值语句以单赋值语句为基础,它们均以复合赋值表达式与连续赋值表达式加分号构成。1.复合赋值语句复合赋值语句是使用+=、-=、*=、/=等运算符构成的赋值语句,这种语句首先需要完成特定的运算然后再进行赋值运算操作。例如:intx=5;x+=6;stringS="abcd";S+="efjh";在上例中,“x+=6;”首先要完成“x+6”的运算操作,然后再完成将运算结果“11”赋值给变量x的运算操作。“S+="efjh";”首先要完成“S”与字符串“efjh”的连接运算操作,然后再完成将运算结果“abcdefjh”赋值给变量S的运算操作。2.连续赋值语句连续赋值语句是在一条语句中使用多个赋值运算符进行赋值的语句,这种语句可以一次为多个变量赋予相同的值。例如:intx,y,z;x=y=z=6;stringS1,S2,S3;S1=S2=S3="efjh"; 16 在上例中“x=y=z=6;”语句使x、y、z同时被赋予整数6;“S1=S2=S3="efjh";”语句使S1、S2、S3同时被赋予字符串“efjh”。需要说明的是,在C#中,所有的符号都被看作运算符,因此赋值符号也是运算符,因此会产生运算结果。例如“x=3;”其运算的结果不仅是使x具有了值3,而且在该运算处还产生一个运算结果3,当这个3向左碰到的是一个赋值运算符时,就会将它赋给赋值运算符左边的变量。这是能够进行连续赋值的原因所在。4.2输入与输出任何一个应用程序在进行数据处理的过程中,都会涉及数据的输入与输出这一基本功能,C#提供了多种数据输入输出的手段。从应用程序的类型看,大致分为控制台应用程序的数据输入输出与窗体应用程序的输入输出。4.2.1控制台应用程序的输入与输出方法控制台应用程序的输入输出主要通过Console类中的静态方法Read、ReadLine、Write、WriteLine方法来实现。1.输方入法在控制台应用程序中,数据的输入,可以通过Console类中静态方法Read与ReadLine方法实现。Read与ReadLine方法的功能是接受从键盘上输入的数据,不同之处是,前者一次从键盘接受一个输入字符,并将该字符换算成相应的整型数值,而后者则一次接受一行字符。例如:charC=(char)Console.Read();//从键盘输入字母a,则变量C的值为aintI=Console.Read();//从键盘输入字母a,则变量I的值为97stringS=Console.ReadLine();//从键盘输入字符串abcd,则变量S的值为abcd如果需要从键盘上输入数值型数据,则必须使用数值类型本身的Parse方法进行转换,Parse方法的功能是将字符串类型的数据转换为相应的数值类型。格式为:数值类型名称.Parse(字符串类型表达式)例如:intI=int.Parse(Console.ReadLine());//输入123,则转换为数值123floatF=float.Parse(Console.ReadLine());//输入123.1则转换为数值123.1doubleD=double.Parse(Console.ReadLine());//输入123.1则转换为数值123.12.输出方法在控制台应用程序中,数据的输出,可以通过Console类中静态方法Write与WriteLine方法实现。图4-1Write与WriteLine的区别Write与WriteLine方法的功能是向屏幕输出一行数据,不同之处是,输出一行数据后前者不换行,后者换行。例如:Console.Write("abcd"); 16 Console.WriteLine("abcd");两者向屏幕输出结果的差别如图4-1所示。Write与WriteLine方法支持格式化输出。例如:Console.WriteLine("{0};{1};{2}",10,20,30);Console.WriteLine("{0}{1},{2}","这两个数是:",10,20);Console.WriteLine("这三个数是:{0},{1},{2}",10,20,30);上面三条语句中的WriteLine方法的括号中均有四项数据,各项数据之间以逗号分隔。其中,第1项数据为字符串类型,后3项数据可以是任意基本数据类型。在第一项的字符串中,大括号及其中的数值具有特定含义,大括号表示对其后面对应数据项的引用,0表示引用其后的第1项数据,1表示引用其后的第2项数据,2表示引用其后的第3项数据,如果数值为n,则表示引用其后的第n+1项数据。因此,这三条语句的输出结果为:10;20;30这两个数是:10,20这三个数是:10,20,30【例4-1】从键盘输入两个整数,输出这两个整数的和、差、积、商。代码如下:usingSystem;namespaceCslAppIO{classClass1{staticvoidMain(string[]args){intNumber1,Number2,Number3;//声明三个整型变量Console.WriteLine("求两个整数的和");Console.Write("输入第一个整数:");Number1=int.Parse(Console.ReadLine());Console.Write("输入第二个整数:");Number2=int.Parse(Console.ReadLine());Number3=Number1+Number2;Console.WriteLine("两个整数的和为:{0}",Number3);Number3=Number1-Number2;Console.WriteLine("两个整数的差为:{0}",Number3);Number3=Number1*Number2;Console.WriteLine("两个整数的积为:{0}",Number3);floatNumber4=(float)Number1/Number2;//声明单精度变量存放商Console.WriteLine("两个整数的商为:{0}",Number4); 16 图4-2程序运行结果Console.ReadLine();}}}在程序的Main方法中为设计的程序代码,其余均为C#自动生成。Main方法中的15条语句,均属于赋值、输入与输出语句,并且是按照设计次序的先后顺序执行的。程序运行结果如图4-2所示。4.2.2Windows应用程序的输入与输出在窗体应用程序中,C#提供了多种数据输入输出的形式,如使用文本框、标签、图片框、信息框及各种选择类控件实现数据的输入与输出。其中使用频度最高的是文本框控件和标签控件。1.使用标签与文本框实现输入与输出图4-3运行结果从使用程序的用户的角度看,文本框和标签控件的主要区别在于标签控件是一个只能向用户显示输出数据的控件,而文本框控件既可以让用户在其中输入数据,也可以向用户显示输出数据。【例4-2】用Windows应用程序实现【例4-1】程序的功能。程序运行结果如图4-3所示。程序设计的具体要求如下:①要求窗体没有最大、最小化按钮,且用户不能调整窗体的大小(提示:可将窗体的最大尺寸属性MaximumSize和最小尺寸MinimumSize属性设置为相同的值)。②用户在两个文本框中输入2个整数后单击【计算】按钮可在标签框中显示计算结果,如图4-3所示。③要求计算结果标签框中的内容分行显示(提示:使用转义字符“ ”实现分行)。④要求【计算】按钮能响应〈Enter〉键,即输入数据完成后,不仅用鼠标单击【计算】按钮可以显示计算结果,按〈Enter〉键可以实现相同的功能;要求【清除】按钮能响应〈Esc〉键,【清除】按钮的基本功能是清空文本框与显示计算结果标签框中的内容。⑤程序启动时或单击【清除】按钮后,“整数1”文本框能得到焦点(自动出现插入点光标)。⑥连续按键盘上的〈Tab〉键时,焦点按“整数1”文本框→“整数2”文本框→【计算】按钮→【清除】按钮的顺序转移。设计步骤如下:(1)设计程序界面 16 启动VS.NET创建一个C#的Windows应用程序项目,指定项目名称及保存位置。向窗体中添加2个文本框控件、3个标签控件和2个按钮控件。适当调整各控件大小及位置。(2)设置窗体及控件对象属性窗体及控件对象属性设置见表4-2表4-2窗体及控件对象属性对象名称属性名称属性值说明label1~label3NamelabNumber1、labNumber2、labResult修改标签对象名称。Text整数1、整数2、""标签标题,其中label3为空。textBox~textBox2NametxtNumber1、txtNumber2修改文本框对象名称。Text文本框内容为空button1~button2NamebtnCalculate、btnCancel修改按钮对象名称Text计算、清除文本标题Form1Text两个整数的和、差、积、商窗体标题MaximizeBox~MinimizeBoxfalse假,不支持最大与最小化操作MaximumSize~MinimumSize300,300用户不能通过拖动窗口边框改变窗口大小,与上一行属性设置结合,使窗口大小不可以改变AcceptButtonbtnCalculate支持回车键CancelButtonbtnClear支持ESC键其余属性取默认值。设置后界面如图4-4所示。图4-4设计界面设置窗体的AcceptButton属性为btnCalculate按钮,CancelButton属性为btnClear按钮时,无需用户输入,可通过属性值右侧下拉列表框进行选择。在窗体中添加文本框控件与按钮控件时,注意添加顺序,按照“整数1”文本框→“整数2”文本框→【计算】按钮→【清除】按钮的顺序添加,即可实现连续按键盘上的〈Tab〉键时,焦点按要求顺序转移的功能。由于标签框不具备获取焦点的属性,所以在添加控件时其添加顺序不需考虑。(3)设计事件代码【计算】按钮被单击时执行的事件代码如下:privatevoidbtnCalculate_Click(objectsender,System.EventArgse){intNumber1,Number2,Number3;//声明三个整型变量Number1=int.Parse(txtNumber1.Text);//使用Parse方法将输入到文Number2=int.Parse(txtNumber2.Text);//本框中的字符串转换为整数labResult.Text="计算结果: ";Number3=Number1+Number2;labResult.Text+=("两个整数的和为:"+Number3+" ");//输出两个整数和(加换行符)Number3=Number1-Number2; 16 labResult.Text+=("两个整数的差为:"+Number3+" ");//输出两个整数差(加换行符)Number3=Number1*Number2;labResult.Text+=("两个整数的积为:"+Number3+" ");//输出两个整数积(加换行符)floatNumber4=(float)Number1/Number2;//声明单精度变量以存放商的值labResult.Text+=("两个整数的商为:"+Number4);//输出两个整数的商}【清除】按钮被单击时执行的事件代码如下:privatevoidbtnClear_Click(objectsender,System.EventArgse){txtNumber1.Clear();//清空“整数1”文本框txtNumber1.Focus();//“整数1”文本框获取焦点txtNumber2.Clear();//清空“整数2”文本框labResult.Text="";//清空输出计算结果标签框}说明:①文本框的Text属性为字符串型变量,如果直接执行“+”运算表示进行字符串的连接,即“543”+“123”的结果为“543123”,且无法将其赋值给整型变量,所以应使用Parse方法将其转换成整型数据而后赋值给整型变量Number1与Number2。②求商时,由于两个操作数都是整型数,所以结果也是整型数,如果有小数,则小数部分将被截去,所以需要声明一个单精度型变量Number4,且将两个运算数之一显式转换为单精度型数值后再进行求商的运算。③两个整数的和、差、积、商输出到标签框中时,采用字符串连接运算符将各项结果依次连接,并使用复合运算符“+=”实现连续连接。每连接一项结果,则再连接一个换行符,以实现分行输出功能。④整型计算结果与字符串可以直接用“+”运算符连接,不需先转换为字符串,C#会自动进行转换。⑤如果输入的数值格式不正确,如输入23.5或ABC等,将引发格式错误异常,如果第二个整数输入值为0,在求商时将引发除数为0异常,处理异常,将在“跟踪调试与异常处理”章节中介绍。2.使用链接标签除了前面介绍过的Label控件外,C#还提供了一种带超链接的标签控件LinkLabel,它在控件工具箱中的图标为。使用这种标签可给标签中的文字设计超链接,使用户可通过单击应用程序中的链接标签访问网络服务。LinkLabel控件的大部分属性、方法和事件都是从Label控件中继承来的,如Text属性用于显示标签的文字内容;AutoSize属性用于自动调整标签大小以适应文字长度等;另外几个关于超链接样式的属性和事件是LinkLabel所特有的,见表4-3。 16 表4-3LinkLabel控件的常用属性及事件类别名称说明属性LinkColor设置控件中未被单击过的文字颜色VisiteLinkColor设置控件中被单击过的文字颜色ActiveLinkColor单击鼠标时文字的颜色LinkVisited超链接是否被访问过,False表示未被访问过(默认值)Links控件中所有链接的集合,属于类LinkLabel.LinkConnectionLinkArea设置Text值(字符串)的链接子串事件LinkClicked用户单击LinkLabel控件时触发的事件通常在LinkLabel控件的单击事件中使用System.Diagnostics.Process.Start方法来打开一个URL,例如下列语句表示打开网易主页:System.Diagnostics.Process.Start("http://www.163.com");使用LinkLabel控件不仅可以打开网页,也可以打开本机文件,例如下面的语句可以打开本机的一个图像文件。System.Diagnostics.Process.Start("e:照片.jpg");如果在程序的开始部分添加对System.Diagnostics命名空间的引用如下:usingSystem.Diagnostics;则可以使用如下语句打开网页或本机文件:Process.Start("http://www.163.com");Process.Start("e:照片.jpg");【例4-3】使用LinkLabel控件设计一个打开Web网页或本机文件的程序,程序界面如图4-5所示。图4-6与图4-7是分别单击“网易”和“本机图片”链接标签的结果。在标签文本中,仅网站域名或本机文件路径部分以超链接形式显示,用户单击不同的链接标签时,标签文本的超链接显示部分将作为Process.Start方法的字符串参数,从而打开相应的网站首页或本机文件。图4-5程序界面图4-6打开网页图4-7打开本机文件(1)设计程序界面创建一个C#项目,向窗体中添加5个链接标签控件LinkLabel1、LinkLabel2、LinkLabel3LinkLabel4、LinkLabel5。适当调整窗体及各控件的大小和位置。(2)设置控件属性 16 将Form1的Text属性设置为“打开网页或本机文件”,窗体中各链接标签的属性设置见表4-4。表4-4LinkLabel1~LinkLabel5控件的属性设置属性名称属性值说明Namelnk163、lnkSina、lnkBaidu、lnkGoogle、lnkLocal设置控件对象名称Text网易(www.163.com)、新浪(www.sina.com.cn)、百度(www.baidu.com)、Google(www.google.com)、本机图片(e:照片.jpg)设置对象的标题属性LinkArea3,11、3,15、3,13、7,14、5,8设置对象标题的链接部分说明:LinkLabel的LinkArea属性有两个值,第一个值为链接的起始位置,0为整个Text属性值的第一个字符,1为第二个字符,依次类推;第二个值为链接字符串的长度,该属性设置后,就会只将设置范围内的字符串设置为超链接内容。(3)设计事件代码首先,在程序代码开始处,即引用命名空间的部分,添加命名空间引用代码如下:usingSystem.Diagnostics;//引用命名空间Diagnostics双击各链接标签设计标签的“网易(www.163.com)”链接标签被单击时执行的代码如下:privatevoidlnk163_LinkClicked(objectsender,System.Windows.Forms.LinkLabelLinkClickedEventArgse){lnk163.LinkVisited=true;Process.Start(lnk163.Text.Substring(3,11));}“新浪(www.sina.com.cn)”链接标签被单击时执行的代码如下:privatevoidlnkSina_LinkClicked(objectsender,System.Windows.Forms.LinkLabelLinkClickedEventArgse){lnkSina.LinkVisited=true;Process.Start(lnkSina.Text.Substring(3,15));}“百度(www.baidu.com)”链接标签被单击时执行的代码如下:privatevoidlnkBaidu_LinkClicked(objectsender,System.Windows.Forms.LinkLabelLinkClickedEventArgse){lnkBaidu.LinkVisited=true;Process.Start(lnkBaidu.Text.Substring(3,13));}“Google(www.google.com)”链接标签被单击时执行的代码如下:privatevoidlnkGoogle_LinkClicked(objectsender,System.Windows.Forms.LinkLabelLinkClickedEventArgse){ 16 lnkGoogle.LinkVisited=true;Process.Start(lnkGoogle.Text.Substring(7,14));}“本机图片(e:照片.jpg)”链接标签被单击时执行的代码如下:privatevoidlnkLocal_LinkClicked(objectsender,System.Windows.Forms.LinkLabelLinkClickedEventArgse){lnkLocal.LinkVisited=true;Process.Start(lnkLocal.Text.Substring(5,8));}说明:①各事件代码中用于打开网页或本机文件的Process.Start方法使用的字符串参数是一个取子串方法(Substring)方法,该方法用于获取链接标签文本中的网页域名(也可以是IP地址)或文件路径。取子串方法是所有字符串类型变量的通用方法,LinkLabel控件的Text属性,属于字符串类型,因此适用该方法。取子串方法需要两个参数,第一个是获取子串的起始位置,第二个是所取子串的长度。代码中使用的取子串的参数均与LinkLabel控件的LinkArea属性的值相同。需要注意的是,设置起始位置的值的含义,字符串中第1个字符的位置值是0,第2个字符串的位置值是1,第n个字符串的位置值是n-1,这点与LinkArea属性相同。②如要打开本机文件,则所选择的文件必须与打开该文件的应用程序建立了关联,即有打开该文件的默认关联程序,否则将引发异常,并提示“没有应用程序与此操作的指定文件有关联”。通常与程序建立了关联的文件都有特定的图标,如.jpg格式的图像文件其图标是“”,而没有与程序建立关联的文件在WindowsXP中的统一图标是“”。4.3使用图片框与图片列表控件图片框控件PictureBox与图片列表控件ImageList用于对图像文件操作。4.3.1使用图片框(PictureBox)图片框控件PictureBox用来在窗体上显示一个图片。前面介绍过的Label控件也可通过其Image属性来显示图片,但与Label控件相比PictureBox显示图片的方法更加灵活,用户除了可通过PictureBox的Image属性显示指定的图片,还可以通过其SizeMode属性设置控件或图片的大小及位置关系。图片框的BorderStyle属性可设置其边框样式:值None表示没有边框;FixedSingle表示单线边框;Fixed3D表示立体边框。SizeMode属性值及说明见表4-5。 16 表4-5SizeMode属性值及说明属性值说明AutoSizePictureBox控件调整自身大小,使图片能正好显示其中CenterImage若控件大于图片则图片居中;若图片大于控件则图片居中,超出控件的部分被剪切掉Normal图片显示在控件左上角,若图片大于控件则超出部分被剪切掉StretchImage若图片与控件大小不等,则图片被拉伸或缩小以适应控件PictureBox控件支持多种格式的图片。可以通过创建一个Bitmap实例并将它赋值给PictureBox控件的Image属性来实现图片显示。下列语句使用Bitmap实例将存放在F盘GIF目录下的图片文件001.gif显示到图片框中:pictureBox1.Image=newBitmap("f:\GIF\001.gif");//new关键字用于创建一个实例也可以通过Image类的静态方法FromFile获取图像文件,并将它赋值给PictureBox控件的Image属性来实现图片显示。下列语句使用FromFile方法将存放在F盘GIF目录下的图片文件006.gif显示到图片框中:pictureBox1.Image=Image.FromFile("f:\gif\006.gif");【例4-4】利用pictureBox控件循环打开若干张图片文件。首先将准备好的若干张图片分别以001.GIF、002.GIF、003.GIF为文件名存放于某文件夹中(如本例的F:GIF),而后按图4-8所示设计程序。程序启动后显示第一张图片,并显示相关提示信息,按钮此时标题为“显示图片2”,单击【显示图片2】按钮时,图片框中显示第二图片,并显示相应信息,此时按钮标题为“显示图片3”,单击【显示图片3】按钮时,图片框显示第三图片,并显示相关信息,此时按钮标题为“显示图片1”,由此完成图片循环显示功能。如果使用选择结构,这一功能较容易实现。在介绍循选择结构,本例以按钮重叠及按钮的Visied属性或隐藏显示方法来实现程序功能。图4-8程序运行界面图4-9程序设计界面程序设计步骤:(1)设计程序界面 16 在C#环境中创建一个新项目,向窗体中添加一个图片框控件PictureBox1,一个标签控件Label1,三个按钮控件Button1、Button2和Button3。由于本例将通过代码来设置图片框控件对象的大小、按钮与标签的位置,因此图片框的大小不需精确调整,按钮与标签控件可随意放置,如图4-9所示。(2)设置对象属性各控件的属性设置见表4-6。表4-6控件对象属性对象名称属性名称属性值说明label1NamelabPicInfo修改标签对象名称。AotuSizetrue根据文本长短自动伸缩button1~button3NamebtnShowPic1、btnShowPic2、btnShowPic3修改按钮对象名称Text显示图片1、显示图片2、显示图片3各按钮标题pictureBox1NamePicBrowse修改图片框对象名称SizeModeStretchImage自动调整图片大小以适应控件Local10,8距窗体顶部及左边的距离(像素)BorderStyleFixed3D立体边框ImageE:GIF 01.GIF预置图片文件其余属性取默认值。(3)设计程序代码窗体载入事件代码设计如下:privatevoidForm1_Load(objectsender,System.EventArgse){//设置窗体的宽度为450像素,高度为450像素this.Width=450;this.Height=450;//设置图片框相对于窗体的宽度为420像素,高度为330像素picBrowse.Width=this.Width-30;picBrowse.Height=this.Height-120;//设置三个按钮距窗体顶端的距离为相同值btnShowPic1.Top=btnShowPic2.Top=btnShowPic3.Top=this.Height-btnShowPic1.Height-60;//设置三个按钮距窗体左边的距离为相同值,与Top属性相结合使按钮重叠btnShowPic1.Left=btnShowPic2.Left=btnShowPic3.Left=(this.Width-btnShowPic1.Width)/2;//设置标签框距窗体顶端的距离,使标签框位于图片框与按钮之间labPicInfo.Top=this.Height-labPicInfo.Height-90;labPicInfo.Text="当前显示为第一张图片";//设置标签框距窗体左边的距离,使标签框居中显示labPicInfo.Left=(this.Width-labPicInfo.Width)/2;}【显示图片1】代码设计如下: 16 privatevoidbtnShowPic1_Click(objectsender,System.EventArgse){btnShowPic2.Visible=true;//设置btnShowPic2按钮为可见btnShowPic1.Visible=false;//设置btnShowPic1按钮为不可见//用图片文件路径为Bitmap实例的参数赋值给picBrowse的Image属性picBrowse.Image=newBitmap("f:\gif\001.gif");labPicInfo.Text="当前显示为第一张图片";//用标签显示相应信息}【显示图片2】设计代码如下:privatevoidbtnShowPic2_Click(objectsender,System.EventArgse){btnShowPic3.Show();//设置btnShowPic3按钮可见btnShowPic2.Hide();//设置btnShowPic2按钮为不可见//用图片文件路径为FromFile方法的参数赋值给picBrowse的Image属性picBrowse.Image=Image.FromFile("f:\gif\004.gif");labPicInfo.Text="当前显示为第二张图片";}【显示图片3】设计代码如下:privatevoidbtnShowPic3_Click(objectsender,System.EventArgse){btnShowPic1.Visible=true;btnShowPic3.Visible=false;picBrowse.Image=newBitmap("f:\gif\006.gif");labPicInfo.Text="当前显示为第三张图片";}说明:①在本例中使用了对象的Width(宽)属性、Height(高)属性及Top、Left属性设置对象的大小及位置,这种方法在窗体界面较大时经常使用,即程序员可通过代码实现对控件大小及位置的控制。特别是使用相对定位法可以使用程序界面被调整时依然保持合理的布局。②如果对象相同的属性取相同的值,则可以使用连续赋值表达式,本例中按钮控件对象的Top、Left属性值,即采用这种方法赋值。③本例在为picBrowse对象的Image属性赋值(显示图片)时使用了两种不同手段,一是用直接创建Bitmap实例的手段,一是使用Image类的FromFile静态方法的手段,结果完全相同。④本例在显示隐藏按钮对象时,也使用了两种形式,一是直接修改属性值,例如代码中的语句“btnShowPic2.Visible=true;”是使【显示图片2】为可见状态;一是使用对象的方法,例如代码中的语句“btnShowPic2.Hide();”是使【显示图片2】为不可见状态。形式虽然不同结果却是一样的。 16 4.3.2使用图片列表控件(ImageList)图片列表框控件ImageList本身并不显示在窗体上,它只是一个图片容器,保存一些图片文件,因此程序运行时,图片列表框控件ImageList是不可见的,但是,这些图片和ImageList控件本身可被项目中其他对象使用,如Label、Button、TreeView、ListView、ToolBar等。ImageList控件的常用属性见表4-7。表4-7ImageList控件的常用属性属性值说明ImageImageList中所有图片组成的集合ImageSizeImageList中每个图片的大小,有效值在1~256之间ColorDepth表示图片每个像素占用几个二进制位,当然位数越多图片质量越好,但占用的存储空间也越大【例4-5】设计一个使用标签控件Label和图片列表控件ImageList组成的图片浏览程序。程序运行时,标签与窗体显示同一幅图片。鼠标指向显示图片的标签时,将变为手形,单击鼠标,窗体与标签同时变换图片。信息标签中显示当前图片编号。程序运行时的界面如图4-10所示。设计步骤如下:(1)设计程序界面创建一个C#项目,向窗体中添加三个标签Label1、Label2和Label3,一个图片列表控件ImageList1。ImageList1在程序运行时仅起到一个图片容器的作用,并不显示到窗体中。将该控件添加到项目中后,显示在窗体设计器下方的窗格中。添加第1个标签控件后适当调整该控件的大小,然后在该控件被选中的情况下,单击工具栏的“复制”按钮,再单击两次“粘贴”按钮,复制两个同样大小的标签,同时选中三个标签,单击工具栏的“水平居中”按钮和“垂直居中”按钮,使三个标签重叠。程序设计界面如图4-11所示。图4-10运行程序图4-11设计界面(2)设置对象属性设置窗体的Text属性为“图片列表示例”,窗体无最大化与最小化按钮,不可调整窗体大小。标签属性设置见表4-8。 16 表4-8标签控件对象属性对象名称属性名称属性值说明label1~label3NamelabShowPic1、labShowPic2、labShowPic3修改标签对象名称。Text空AotuSizetrue根据文本长短自动伸缩BackColorTransparent透明(Web颜色)CursorHand鼠标进入控件区域后呈手形光标选中窗体设计器下方窗格中的ImageList控件,如图4-12所示在属性窗口中单击Images属性右侧的按钮,打开图4-13所示的“Image集合编辑器”对话框。图4-11设置ImageList控件的Images属性图4-12ImageList的Image集合编辑器单击【添加】按钮,打开“打开”对话框选择需要的图片后单击【打开】按钮,重复执行上述操作直到将所有需要的图片全部添加到对话框的“成员”列表框中,该列表框表示ImageList控件中的图像成员,每个图片图标的左侧有一个索引号,表示图片在控件图片列表中的位置,起始索引号为0。图片添加完成后,在“成员”列表中选择某图片后单击图标和图标可以调整该图片在ImageList中的排列顺序。在“Image集合编辑器”对话框右侧的只读System.Drawing.Bitmap属性窗格中显示有当前图片的一些属性信息,其中最主要的是Size属性,它表示了当前图片的大小。设置ImageList控件的Name属性为picList,ImageSize属性为(150,150)。对象的其他属性在窗体Form1的Load事件代码中设置。(3)编写事件代码窗体装入时执行的代码如下:privatevoidForm1_Load(objectsender,System.EventArgse){//标签labShowPic1的ImageList属性获取图片列表控件对象labShowPic1.ImageList=picList;//设置labShowPic1的图片索引ImageIndex的值为0,即显示第一张图片labShowPic1.ImageIndex=0; 16 //窗体载入同一图片this.BackgroundImage=picList.Images[0];}labShowPic1标签的单击事件代码如下:privatevoidlabShowPic1_Click(objectsender,System.EventArgse){labShowPic1.Hide();//隐藏labShowPic1标签,即隐藏第一张图片labShowPic2.Show();//显示labShowPic2标签labShowPic2.ImageList=picList;//获取图片列表对象labShowPic2.ImageIndex=1;//获取图片列表中图片的索引值,即显示第二张图片this.BackgroundImage=picList.Images[1];//获取同一张图片(第二张图片)}labShowPic2标签单击事件代码如下:privatevoidlabShowPic2_Click(objectsender,System.EventArgse){labShowPic2.Hide();labShowPic3.Show();labShowPic3.ImageList=picList;labShowPic3.ImageIndex=2;this.BackgroundImage=picList.Images[2];}labShowPic3标签单击事件代码如下:privatevoidlabShowPic3_Click(objectsender,System.EventArgse){labShowPic3.Hide();labShowPic1.Show();labShowPic1.ImageList=picList;labShowPic1.ImageIndex=0;this.BackgroundImage=picList.Images[0];}说明:本例与【例4-4】功能类似,都是通过控件的显示与隐藏来完成循环显示图片,但使用标签的单击事件来实现,且标签的控件定位与重叠在设计时完成。本例中的图片不是通过指定文件路径加载的,而是预先置入图片列表控件中,这样作的不足是GIF格式的动画无法再实现,而直接加载文件,可以实现动画效果。①①②③⑤4.4习题 16