第9章Windows应用程序设计基础C#是一种可视化的程序设计语言。Windows窗体和控件是开发C#应用程序的基础,窗体和控件在C#程序设计中扮演着重要的角色。在C#中,每个Windows窗体和控件都是对象,都是类的实例。窗体是可视化程序设计的基础界面,是其他对象的载体和容器。控件是添加到窗体对象上的对象,每个控件都有自己的属性、方法和事件以完成特定的功能。Windows应用程序设计还体现了另外一种思维,即对事件的处理。22020/4/5C#程序设计实用教程本章将介绍建立Windows应用程序、使用WindowsForms常用控件、菜单和多文档界面设计等。同时向大家展示用Windows窗体来编写程序的特点以及技巧。32020/4/5C#程序设计实用教程9.1Windows应用程序的结构•VS.NET集成开发环境是基于.NETFramework构建的,该框架提供了一个有条理的、面向对象的、可扩展的类集,它使用户得以开发丰富的Windows应用程序。•通过Windows“窗体设计器”进行设计窗体,用户就可以创建Windows应用程序和客户机/服务器应用程序。用户可对窗体设定某些特性并在其上添加控件,然后编写代码以增加控件和窗体的功能。42020/4/5C#程序设计实用教程9.1Windows应用程序的结构VS.NET提供了很多工具可以使应用程序的开发快捷、可靠。这些工具包括:Windows窗体可视化设计器。识别代码编辑器。集成的编译和调试。项目管理工具。52020/4/5C#程序设计实用教程9.1Windows应用程序的结构典型的Windows应用程序通常包括窗体(Forms)、控件(Controls)和相应的事件(Events)。下面通过C#设计实现一个简单的计算器,要求能够实现基本的加、减、乘、除功能,并以这个“计算器”为例,来了解和掌握Windows应用程序的一般开发过程。62020/4/5C#程序设计实用教程9.1.1计算器窗体Windows窗体就是创立Windows应用程序的框架。在VS.NET中创建Windows应用程序的第一步就是建立这个框架。操作步骤如下:(1)运行VS.NET,在【起始页】上单击【新建项目】按钮,打开“新建项目”对话框,如图9-1所示。在“项目类型”列表框中指定项目的类型为“ViusalC#”,在“模板”列表框中选择“Windows应用程序”模板,在“名称”文本框中输入Calculator,在“位置”下拉列表中选定保存项目的位置。72020/4/5C#程序设计实用教程9.1.1计算器窗体(2)单击“确定”按钮后就进入VS.NET的主界面,如图9-2所示。8•从图9-2可以看出,当选择“Windows应用程序”作为应用程序的模板后,系统会自动为用户生成一个空白窗体,一般名为Form1。•该窗体就是应用程序运行时显示给用户的操作界面,下一步就是向窗体中添加各种控件。2020/4/5C#程序设计实用教程9.1.2计算器控件控件表示用户和程序之间的图形化连接。控件可以提供或处理数据、接受用户输入、对事件做出响应或执行连接用户和应用程序的其他功能。因为控件本质上是具有图形接口的组件,所以它能通过组件所提供的功能并与用户交互。窗体中的控件有很多,“工具箱”中的“Windows窗体”里包含了所有Windows的标准控件,用户还可以根据需要自己定义控件。通过在“属性”窗口中改变控件的属性可以改变的外观和特性。92020/4/5C#程序设计实用教程9.1.2计算器控件本例中需要用到如下所列的控件:(1)按钮:16个。10个数字按钮分别用于表示0~9;4个运算符按钮表示“+”、“-”、“*”、“\”;1个“计算”按钮用于实施计算操作;1个“清空”按钮用于清除上次计算结果。(2)标签:1个。用于标示计算结果所在的文本框。(3)文本框:1个。用于显示计算结果。102020/4/5C#程序设计实用教程9.1.2计算器控件具体添加控件步骤如下:首先向窗体中添加按钮(Button)。具体操作为:在工具箱中单击Button,然后移动鼠标指针到窗体中的预定位置,按下左键拖动鼠标,划出一个方框,释放鼠标左键后,一个按钮就被添加到刚才方框的位置了。调整好大小和位置后单击选中该按钮,在“属性”窗口中可以看到该控件名为Button1,将该按钮的Text属性设置为“1”。继续在窗体中添加其余15个按钮,并分别设置好它们的属性。112020/4/5C#程序设计实用教程9.1.2计算器控件界面设计已经完成了,接下来的事情就是为各个控件添加相应的事件代码了。12•按照同样的方法在窗体中添加一个标签(Label),设置其Text属性为“结果”,再添加一个文本框(TextBox),并设置其Text属性为空。•最后,一个简单的计算器的界面就完成了,如图9-3所示。2020/4/5C#程序设计实用教程9.1.3计算器事件在C#中,基于Windows应用程序设计方法是事件驱动的。事件驱动不是由程序的顺序来控制的,而是由事件的发生来控制的。事件驱动程序设计是围绕着消息的产生与处理而展开的,消息就是关于发生的事件的信息。Windows程序员的工作就是对所开发的应用程序所要发出或者接收的消息进行排序和管理。事件驱动程序方法提供了许多便利,对于那些需要大范围用户干预的应用程序来说,更是很有用处。132020/4/5C#程序设计实用教程9.1.3计算器事件在“窗体设计器”中看到的是窗体及其中的控件,而要为控件添加事件处理程序就必须先切换到代码编辑器状态。切换到代码编辑器有以下几种方法:(1)双击窗体或者某控件。(2)在解决方案资源管理器中右键单击Form1.cs,从快捷菜单中选择“查看代码”命令。如果选择“视图设计器”则可以回到“窗体设计器”中。(3)当第一次切换到代码编辑器之后,在窗体标题“Form1.cs[设计]”的左边会自动出现一个新的标题:Form1.cs,单击该标题就可以切换到代码编辑器。反之,如果单击“Form1.cs[设计]”则会切换到“窗体设计器”。142020/4/5C#程序设计实用教程9.1.3计算器事件下面分析一下计算器中各个控件到底应该添加什么样的代码。对于计算器来说,当单击某个数字键后,结果显示区内应显示该键上的数字。因此,可以双击按钮“1”,切换到代码编辑器,此时光标就停留在该按钮所对应的代码处,输入下列代码:privatevoidbtn1_Click(objectsender,EventArgse){Buttonbtn=(Button)sender;textBox1.Text+=btn.Text;}152020/4/5C#程序设计实用教程9.1.3计算器事件继续给其他数字按钮添加同样的代码。然后给4个运算符按钮添加下列代码:privatevoidbtnAdd_Click(objectsender,EventArgse){Buttonbtn=(Button)sender;textBox1.Text=textBox1.Text++btn.Text+;//空格用于分隔数字各运算符}162020/4/5C#程序设计实用教程9.1.3计算器事件privatevoidbtnSub_Click(objectsender,EventArgse){Buttonbtn=(Button)sender;textBox1.Text=textBox1.Text++btn.Text+;//空格用于分隔数字各运算符}privatevoidbtnMul_Click(objectsender,EventArgse){Buttonbtn=(Button)sender;textBox1.Text=textBox1.Text++btn.Text+;//空格用于分隔数字各运算符}172020/4/5C#程序设计实用教程9.1.3计算器事件privatevoidbtnDiv_Click(objectsender,EventArgse){Buttonbtn=(Button)sender;textBox1.Text=textBox1.Text++btn.Text+;//空格用于分隔数字各运算符}接下来给“清空”按钮添加如下代码:privatevoidbtnClear_Click(objectsender,EventArgse){textBox1.Text=;}182020/4/5C#程序设计实用教程9.1.3计算器事件最后给“计算”按钮添加下列代码:privatevoidbtnCalculate_Click(objectsender,EventArgse){Singler;//用于保存计算结果stringt=textBox1.Text;//t用于保存文本框中的算术表达式intspace=t.IndexOf('');//用于搜索空格位置strings1=t.Substring(0,space);//s1用于保存第一个运算数charop=Convert.ToChar(t.Substring(space+1,1));//op用于保存运算符strings2=t.Substring(space+3);//s2用于保存第二个运算数Singlearg1=Convert.ToSingle(s1);//将运算数从string转换为SingleSinglearg2=Convert.ToSingle(s2);192020/4/5C#程序设计实用教程9.1.3计算器事件switch(op){case'+':r=arg1+arg2;break;case'-':r=arg1-arg2;break;case'*':r=arg1*arg2;break;202020/4/5C#程序设计实用教程9.1.3计算器事件case'/':if(arg2==0){thrownewApplicationException();}else{r=arg1/arg2;break;}break;default:thrownewApplicationException();}212020/4/5C#程序设计实用教程9.1.3计算器事件//将计算结果显示在文本框中textBox1.Text=r.ToString();}现在,所有的工作都完成了。在“调试”菜单中选择“启动”命令或者“开始执行(不调试)”命令运行该应用程序,计算器可以工作了。222020/4/5C#程序设计实用教程9.2Windows窗体通过“计算器”这个例子,已初步了解了Windows应用程序的结构。下面具体介绍Windows应用程序的设计和开发。一个应用程序除了需要实现应有的功能外,还必须具有良好的用户界面。在C#中,Windows应用程序的界面是以窗体(Form)为基础的,窗体是Windows应用程序的基本单位,用来向用户展示信息和接受用户的输入。窗体可以是标准窗口、多文档界面(MDI)窗口、对话框的显示界面。232020/4/5C#程序设计实用教程9.2Windows窗体窗体就好像一个容器,其他界面元素都可以放置在窗体中。C#中以类Form来封装窗体,一般来说,用户设计的窗体都是类Form的派生类,用户窗体中添加其他界面元素的操作实际上就是向派生类中添加私有成员。当新建一个Windows应用程序项目时,C#就会自动创建一个默认名为Form1的Windows窗体。242020/4/5C#程序设计实用教程9.2Windows窗体Windows窗体由以下4部分组成:标题栏控制按钮边界窗口区252020/4/5C#程序设计实用教程9.2.1Windows窗体的基本属性Windows窗体的属性可以决定窗体的外观和行为,其中常用的属性有:名称(Name)属性、标题(Text)属性、控制菜单属性和影响窗体外观的属性。1.窗体的名称属性(Name)Name用于设置窗体的名称,该属性值作为窗体的标志,用于在程序中引用窗体。在初始新建一个Windo