1、Visual Studio.Net 开发环境介绍概述.NET Framework.NET Framework框架Visual Studio.NetVisual Studio.Net集成开发环境(IDEIDE)程序设计语言 C#C#.NET.NET 相关知识学会开发:WindowsWindows窗体应用程序 WebWeb应用程序1.1 Visual Studio.Net 架构1.2.NET Framework框架.NET Framework=CLR+.NET Framework=CLR+基类库公共语言运行时CLR CLR 统一的编程类库1.3.NET Framework框架公共语言运行时是 .N
2、ET Framework.NET Framework 的基础。内存管理、线程管理、远程处理等核心服务 强制实施严格的类型安全 可提高安全性和可靠性的其他形式的代码准确性事实上,代码管理的概念是运行时的基本原则。托管代码:以运行时为目标的代码非托管代码:不以运行时为目标的代码.NET Framework.NET Framework 类库是一个与公共语言运行时紧密集成的可重用的类库集合。该类库是面向对象。此外,第三方组件可与 .NET.NET Framework Framework 中的类无缝集成。1.4 C#运行模型1.5 版本回顾1.6 新增特性.NET Framework 1.1,2.0版本
3、新增功能http:/ Framework 3.0 版介绍http:/ Framework 3.5 版新增功能http:/ Framework 4.0版本新增功能http:/ Visual Studio.Net集成开发环境(IDE)工具箱工具箱任务列表任务列表解决方案解决方案资源管理器资源管理器动态帮助动态帮助编辑器编辑器/浏览器浏览器属性属性服务器资服务器资源浏览器源浏览器对象浏览器对象浏览器2.2 Visual Studio.NET的优点多语言支持 Visual Studio.NET 支持 Visual Basic.NET、C#、Visual C+.NET、Visual J#.NET风格统一
4、的集成开发环境 不同的语言、不同类型的项目使用相同的集成开发环境 自定义用户界面多项目支持 支持各种类型项目的开发 在一个解决方案中包含多种类型的项目 单启动项目和多启动项目 强大的调试支持 反汇编、内存监视、寄存器监视、监视表达式、断点、逐句执行、运行到指定位置、设置执行点 实时调试、本地调试、远程调试起始页2.3 解决方案解决方案的定义 一个逻辑上的容器,包含构成应用程序的项目和其它文件解决方案的组成 一个解决方案可以包含一个或多个项目 解决方案可以包含独立于项目的文件 被多个项目共享的文件,将被生成到应用程序中 杂项文件,不会被生成到应用程序,仅被解决方案引用使用解决方案的优点 可以同时
5、使用多个不同类型的项目 全权处理文件管理细节,用户可以集中精力开发、部署应用程序 使用解决方案资源管理器可观察所有的项目和文件2.4 项目定义项目的定义 项目是解决方案的构件块,由文件组成,它的输出结果通常为可执行文件(.EXE)或动态链接库(.DLL)所有的项目都包含在解决方案中,并且含有一个惟一的项目文件(扩展名csproj)项目文件含有对应项目所包含的文件的一个列表以及它们的跟踪信息项目通常包含多个项2.5 集成环境演示 创建解决方案 添加控件和编写代码 编译和运行程序 代码分析2.5.1 创建解决方案 选择【文件】|【新建】|【空白解决方案】命令,打开【新建项目】对话框 为解决方案起名
6、为“Demo”在【解决方案资源管理器】中,右击解决方案选择【添加】|【新建项目】命令 在【添加新项目】对话框中选择C#类型项目和windows应用程序2.5.2 添加控件并编写代码 打开【工具箱】窗口,从【windows窗体】栏选择一个Button和一个Label,并拖放到窗体上。双击Button控件,进入代码编辑器,在光标所在位置添写代码。编辑器环境简介当输入“.”时,会提示该对象的所有方法、属性和事件,可直接选择,按“Enter”键。当输入“(”时,会显示一个浮动窗口,它包含了该方法的输入参数类型和个数,确保正确调用。关键字、标识符和操作符等不同类别单词可以显示不同颜色。可在【工具】|【选
7、项】中设置。对于错误代码会在该代码下显示红色波浪线。对于不清楚的关键词,可以选中该单词后按F1键,直接查看帮助。2.5.3 编译并运行程序按F5或者选择【调试】|【启动】命令可以进行编译。当有多行代码时可以用F11或者选择【调试】|【逐语句】进行跟踪单步调试。2.5.4 代码分析1.命名空间:对类型进行逻辑分组 using System;namespace WindowsApplication1 类定义;2.类 Visual C#中的每个对象都必须属于一个类。如:public class Form1:System.Windows.Forms.Form3.Main()方法 所有的Visual C
8、#程序都必须包含一个Main()方法,是程序的入口点。4.注释语句1)单行 2)多行 3.1 C#概述1.和c+/c的相同点C#从CC+语言发展而来,它继承了CC+语言的许多特性.主要体现在语句、表达式和运算符上。大小写敏感;注释语句以“/”开头或者“*.*”;以“;”结尾;使用“”来括起语句块2.C#的改进类型安全的,支持版本化,支持事件,支持无用单元收集,支持属性化编程支持COM平台和元数据支持XML和WEB组建开发C#中的所有字符以Unicode形式存放,每个字符占2个字节3.2 C#语言基础标识符 以字母或下划线开始,其后跟任意字母、数字、下划线的字符串 用于变量名、常量名、函数名、类
9、名、对象名等名字的表示 代码中的各种标识符都是Unicode的形式(C#的源文件都是以Unicode的形式保存)变量常量 const 类型标识符 变量名=表达式;3.3 简单数据类型 数值类型 整型 有符号 sbyte short int long 无符号 byte ushort uint ulong 浮点型 float double 小数型 decimal 字符类型 字符型 char 字符串型 string 布尔类型3.4 C#运算符3.4 C#运算符成员访问运算符 .访问类型的成员索引运算符 通过索引的形式来访问数组、索引器或属性类型转换运算符()进行类型转换操作对象创建运算符 new 用
10、来创建对象并调用对象的构造函数System.Widows.Forms.MessageBox.ShowStr12=“Hello”;int a(int)x;Classl MyClassnew C1assl();int inew int();3.4 C#运算符类型信息运算符:运行时检查或获取对象的类型信息,is:判断对象运行时的类型是否与给定类型兼容。例如:int i;if(i is int)as:用于执行兼容类型之间的转换。例如:int i;double j=i as double;Sizeof:用来获取值类型的大小,以字节为单位Typeof:返问一个类型的System.Type 对象 运算符的优
11、先级3.5 C#常用语句 声明语句:用于变量或常量的申明 嵌入语句 语句块 空语句 “;”表达式语句 x=a+b;条件选择语句 循环语句 跳转语句 异常处理语句 using语句(类似于include和import)3.5 C#常用语句using用法(1)引用命名空间 using Namespace;(2)创建命名空间别名 using alias=namespace|type;(3)强制资源清理 清理非托管资源,不受GC控制的资源。Using结束后会隐式的调用Disposable方法。using(Class1 c=new Class1()/清理非托管不受GC控制的资源 但是当对象使用using关
12、键字的时候,必须实现IDisposable接口。其实using的使用和try-catch-finaly中,在finaly代码域调用Disposable方法效果一样。注意Using不能使用多个不同的类 3.5.1 C#常量/变量声明C#中不能声明全局变量或全局静态变量。所有声明变量都是局部变量或类的成员变量。例题:static void main()int a;int b=2,c=3;const float pi=3.14;readonly 关键字与 const 关键字不同。const 字段只能在该字段的声明中初始化。readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数
13、,readonly 字段可能具有不同的值。另外,const 字段为编译时常数,而 readonly 字段可用于运行时常数,3.5.2 条件选择语句 C#中包含两种条件选择语句:if else 语句 switch-case语句 Switch(表达式)case 常数表达式;/语句块 跳转语句 (break,return,goto)default:语句块 if(表达式)语句块1 else 语句块23.5.3 循环迭代语句 循环语句用来反复地执行些操作。用户可以指定循环的次数,或者指定循环的条件。四种循环语句:for语句 Foreachin语句 while语句 do语句for循环 for(初始化;表达
14、式;迭代部分)例如:for(int i=0;i10;i+)Console.WriteLine(i);foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组。foreach语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知的副作用。foreach 语句适用于实现了 System.Collections.IEnumerable或 System.Collections.Generic.IEnumerable接口的对象集合或数组。可以在 foreach 块的任何点使用 break 关键字跳出循环,或使用 continue 关键字进入循环的下一轮迭代,还可以通过 g
15、oto、return 或 throw 语句退出。集合对象是指实现了IEnumerable接口的对象,而不是IEnumerator接口。但是C#的要求并不严格,即虽然没有显式继承IEnumerable接口,但只要类声明中包含GetEnumerator()方法即可。foreach会自动对迭代器返回的类型进行强制类型转换int numbers=1,2,3,4,5,6,7,8,9foreach(int element in number)System.Console.WriteLine(element);while语句例:int i=0;while(i10)Console.Write(i);i+;do
16、语句例:int i=0;do(i10)Console.Write(i);i+;while(i10)3.5.4 跳转语句break 从循环或条件语句中跳出,执行下一条语句continue 对循环体内continue语句之后语句不执行,开始下一次循环return 将控制返回调用的方法 如果返回类型为void,则return可以省略3.5.5 方法调用语句 参数的使用 在C#中,方法本身只能返回一个值 可通过引用类型的参数从方法中获取多个输出值。ref、out两种参数声明方式 Params参数声明方式:声明变长参数列表 1.ref参数ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时
17、,在方法中对参数的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。传递到 ref 参数的参数必须初始化2.out参数用法和作用类似于ref参数out参数声明方式不要求变量传递给方法前进行初始化在方法返回前,必须对out参数进行赋值。注意:在采用引用参数的方法中,多个形参可能表示同一存储位置。例如:class A string s;void F(ref string a,ref string b)s=One;a=Two;b=Three;void G()F(ref s,ref s);3.params参数用来声明可变长度的参数列表声明时,par
18、ams参数后面不能再有其他的参数方法声明中只能包含一个params参数。using System;public class MyClass public static void UseParams(params int list)for(int i=0;ilist.Length;i+)Console.WriteLine(listi);Console.WriteLine();public static void UseParams2(params object list)for(int i=0;ilist.length;i+)Console.WriteLine(object)listi);Con
19、sole.WriteLine();public static void Main()UseParams(1);UseParams(1,2,3);UseParams2(1,a,”test”);int myarray=new int3 10,11,12;UseParams(myarray);3.5.6 异常处理语句在程序的执行过程中不可避免地要出现异常情况,包括系统产生的异常以及程序本身产生的异常异常处理机制 C#语言提供了对异常处理的内建支持,即通过throw、try、catch、finally语句实现的结构化、统一的、类型安全的异常处理机制。1.throw 语句 当在程序的执行过程中遇到异常情
20、况时,例如打开文件失败等,用户就可以使用throw语句报告发生了异常。格式 throw 异常对象 异常对象是从System.Exception 类型派生的类的实例2.Try-Catch-Finally语句try Console.WirteLine(“Executing the try statement.”);throw new NullReferenceException();catch(NullReferenceException e)/捕获特定异常 Console.WirteLine(“0 Caught exception#1.”,e);catch/捕获所有异常 Console.Wirt
21、eLine(“0 Caught exception#2.”);finally Console.WirteLine(“Executing finally block.”);3.5.7 预处理器指令 预处理器指令具有以下功能:有条件的忽略源代码某些部分 报告错误和警告条件 描述源代码不同区域 C#中包含以下几种预处理器指令:1)#define指令该指令用来定义一个符号,然后就可以在#if指令中使用这个符号进行判断。例如:#define DEBUG2)#undef指令取消一个符号的定义(包括已经使用#define指令定义的符号)例如:#undef DEBUG3)#if、#else、#elif、#en
22、dif指令:条件指令,控制编译器的编译过程。例题:#define A#undef Bclass C#if!Avoid F()#elif Bvoid G()#else void H()#endif4)#warning,#error#if DEBUG#warning DEBUG is defined#error 使用error指令产生的错误信息5)#region 和#endregion指令用于标记原代码中的一段区域。3.6 C#类型系统声明变量的内部机制在.NET程序中,当你声明一个变量,将在内存中分配一块内存。这块内存分为三部分:1,变量名;2,变量类型;3,变量值。栈和堆public void
23、 Method1()/Line 1 int i=4;/Line 2 int y=2;/Line 3 class1 cls1=new class1();第1行:当这行代码执行时,编译器为它分配一小块栈内存。运行时栈负责提供程序所需的内存;第2行:程序继续执行。如同名字一样,栈在第一块内存的顶部分配了一块内存。你也可以认为是模块或零件一块一块叠起来;内存的分配与释放遵循后进先出(后进先出)逻辑,换句话说,内存只能在示例中i内存块的顶部分配或释放。第3行:我们创建了一个对象。当该行执行时,编译器在站上创建了一个指针,真实的对象存储在另一种叫“堆”的内存中。堆并不跟踪运行内存,它更像一堆随时可以访问的
24、对象。堆用于动态分配内存。这里需要着重说明的是引用指针是分配在栈上。声明Class1 cls1时并不会给Class1的实例分配内存,而是分配一个栈变量cls1(并设置为null),然后把它指向“堆”。退出方法:当方法退出时,它释放了栈上所有内存变量。换句话说,栈上所有的Int变量都依据后进先出的逻辑被释放掉了。要注意,此时不会释放堆内存,这种内存稍后会被“垃圾收集器”释放。值类型值类型的数据和内存在同一个位置引用类型是一个指向内存的指针。右图示例是一个整形数据类型变量i被赋给另一个整形数据类型变量j。它们的内存值都分配在栈上。当我们把一个int值分配给另外一个int值时,需要创建一个完全不同的
25、拷贝。换句话说,你可以改变其中任何一个而不会影响另外一个。这种数据类型被称为值类型。引用类型当我们创建一个对象,并把一个对象赋给另外一个对象时,它们的指针指向相同的内存(如右图,当我们把obj赋给obj1时,它们指向相同的内存)。换句话说,我们改变其中一个,会影响到另外一个,这种类型称为引用类型。装箱与拆箱 数据从值类型转变为引用类型的过程称为“装箱”,反之为“拆箱”当我们把一个值类型装箱为引用类型时,数据从栈移动到堆上。反之,数据从堆移动到栈上。这种在堆和栈之间的移动带来了性能的损失。如果编译上面的代码,在ILDASM中看IL代码就会发下如何进行装箱拆箱操作的装箱拆箱的性能影响为了揭示装箱拆
26、箱如何影响性能,我们把下面代码运行10000次。一个函数有装箱操作,另一个只有简单代码。我们用简单的计时器看它们的运行时间。装箱函数耗时 3542 MS,无装箱操作的耗时2477MS。这说明在实际项目中,除非必须,否则应避免装箱,拆箱操作。3.6.1命名空间namespace NameSpace1 /声明命名空间public class MyClass public override string Tostring()return“You are in NameSpace1.MyClass”;namespace NameSpace2class MyClasspublic static void
27、 SayHello()Console.WriteLine(“Hello NameSpace2.MyClass”);命名空间是个逻辑层次结构,可以理解成文件夹与文件(命名空间与类)命名空间与类型的名字一起构成类型的完全限定名,惟一地标识一个类型namespace N1 /N1 class C1 /N1.C1 class C2 /N1.C1.C2 namespace N2 /N1.N2 class C2 /N1.N2.C2 3.6.2 结构类型自带简单类型:.net类库中相应类的别名,可以直接使用。用户自定义类型:struct关键字 public struct Point:接口名】public i
28、nt x,y;public Point(int p1,int p2)x=p1;y=p2;几点注意:访问修饰符:public,private,protect,internal 结构没有父类,也不能作为父类派生,但可以实现接口。结构中可以包含:构造函数,字段,方法,属性,索引器,操作符,嵌入式类型。C#的结构类型中只能定义带参数的构造函数。3.6.3 枚举类型从System.Enum类派生。例如:enum Days Sat,Sun,Mon,Tue,Wed,Thu,Fri枚举由一组命名常数组成,称为枚举列表。每个枚举类型有一个底层基本类型,为内建的无符号或有符号整数。第一个元素默认值为0,可以在定义
29、时重新指定。例如:enum Days Sat=1,Sun,Mon,Tue=100,Wed,Thu,Fri枚举类型不包含方法,接口,属性或者事件。3.6.4 包装与拆包每个值类型都有一个与之相对应的引用类型,称为包装类型。包装用来把值类型转换成object类型(引用类型)。例如:using System;class Test static void Main()int i=123;object o=i;/包装 int j=(int)o;/拆包 3.6.5 类 类是种引用类型,它可以包含数据成员(常数、字段)和函数成员(方法、属性、索引、事件、构造函数和析构函数),在类中还可以包含嵌入类型。C#中
30、只支持单继承,但可以实现多个接口。派生类将继承基类中除构造函数和析构函数之外的所有成员。1.1.类的定义类的定义 属性修饰符class 类名:基类列表修饰符:public,protected,internal,private,abstract等。基类列表:表示基类的名称和该类实现的接口。例如:class A class B:A class C:iface1,iface2 class D:B,iface1 2.2.构造函数和析构函数构造函数和析构函数Class A public A(int x);A()3.3.字段字段 字段表示与对象或类相关的变量,它等同于C+中的成员变量。class A pu
31、blic int a;public static int x=1,y,z=100;public static readonly b=1000;int d;4.4.方法方法class A /方法重载 int Method1()return 0;int Method1(int i)return i;int Method1(double b)return b;public void F()Console.WriteLine(“A.F”);/静态方法 public static void Method2()/虚方法 public virtual void G()Console.WriteLine(“A
32、.G”);/抽象方法 public abstract void Method3();/没有实现Class B:A /new 隐藏基类的方法 new public void F()Console.WriteLine(“B.F”);/override 覆盖基类的方法,实现类的多态性 public override void G()Console.WriteLine(“B.G”);/override实现抽象方法Public override void Method3()Console.WriteLine(“implement abstract method3”);Class Test static
33、void Main()B b=new B();A a=b;/父类对象指向子类对象 a.F();b.F()a.G();/调用子类对象的G()b.G();Base和thisoverride void Method1()base.Method1();/调用基类的方法 this.Method2();/调用本类的方法5.属性 属性(property)实质是一种成员方法,但可以像访问字段一样访问它。属性的组成 get方法 set方法public class Person private string id;public string Id get return id;set id=value;public
34、 class AppMain public static void Main()Person p1=new Person();p1.Id=“123456”;Console.WriteLine(“0”,p1.Id);定义属性,属性标志符Id私有字段id调用set方法value隐含的值为“123456”调用get方法返回id的值get方法对成员值进行读操作,不带参数返回类型与返回的成员值类型相同,必须以return或throw语句终止set方法对成员值进行写操作,使用称为value的隐式参数无返回类型只具有get方法的属性称为只读属性只具有set方法的属性称为只写属性6.6.代理代理代理的对象是方
35、法(指向方法的引用)类似于C+中的函数指针代理都是从System.Delegate类派生的,可以代理静态方法或实例方法声明代理时,需要指明代理将要封装的函数原型代理类型的声明属性 修饰符 delegate 返回类型 代理类型名称(形式参数列表);例:delegate int MyDelegate();表示MyDelegate可以代理任何没有参数,返回值为int的方法public class public class MyDelegateTestMyDelegateTest /步骤步骤1 1,声明,声明delegatedelegate类型类型 public delegate void publi
36、c delegate void MyDelegate(stringMyDelegate(string name);name);/定义要传递的方法,它与定义要传递的方法,它与MyDelegateMyDelegate具有相同的参数和返回值类型具有相同的参数和返回值类型 public static void public static void MyDelegateFunc(stringMyDelegateFunc(string name)name)Console.WriteLine(HelloConsole.WriteLine(Hello,0,name);,0,name);public stati
37、c void Main()public static void Main()/步骤步骤2 2,创建,创建delegatedelegate对象对象 MyDelegateMyDelegate mdmd=new =new MyDelegate(MyDelegateTest.MyDelegateFuncMyDelegate(MyDelegateTest.MyDelegateFunc););/步骤步骤3 3,调用,调用delegate delegate md(sam1111);md(sam1111);7.7.事件、事件、事件是一个对象用来通知用户某个动作的发生而发出的消息C#事件建立在代理机制上,当声明
38、一个事件成员时,类就会为它创建一个对应的代理类型的字段或属性在包含事件声明的类外可以使用+=将事件处理程序关联到事件成员上,使用-=从事件成员中删除关联的事件处理程序using System;public delegate void MyDlg();public class MyClass public event MyDlg MyEvent;public void FireAway()if(MyEvent!=null)MyEvent();public class MainClass static private void f()Console.WriteLine(当事件发生时调用这个方法当事
39、件发生时调用这个方法);static public void Main()MyClass mc=new MyClass();mc.MyEvent+=new MyDlg(f);mc.FireAway();Console.ReadLine();定定义义一个代理一个代理MyDlg()声明事件声明事件对对象象MyEvent调调用事件用事件把方法加到事件把方法加到事件,即即定定义义事件事件方法与方法与代理代理类型相类型相同同建立事件代理的步骤定义delegate对象类型定义一个类,该类中包含事件成员及触发事件的方法。在另一个类中定义事件处理方法,它应当与delegate对象具有相同的参数和返回值类型用+
40、=操作符将事件处理程序和事件进行绑定 (-=操作符取消事件的绑定)在适当的地方调用事件触发方法触发事件8.8.接口接口1)接口的定义接口定义了一个契约(协议)所有实现接口的类或结构都必须要遵守这个契约接口独立于类,它规定了类之间交互的标准接口定义格式 属性 修饰符 interface 接口名:基接口列表 /语句 public interface IShowInfo /定义一个接口定义一个接口 int x /属性属性 get;/没有实现的没有实现的 set;void ShowInfo();接口名称一般用大接口名称一般用大写写I开开头头2)接口的组成方法在接口中只能包含方法而不能包含变量或常量属性
41、属性是方法索引器索引器是方法事件89interface INumber int x get;set;int y get;set;class Number:INumber private int myX;private int myY;public Number(int x,int y)myX=x;myY=y;public int x get return myX;set myX=value;public int y get return myY;set myY=value;class AppMain private static void WritePoint(INmuber p)Consol
42、e.WriteLine(“x=0,y=1”,p.x,p.y);public static void Main()Number p=new Number(1,2);Console.Write(“Number is:”);WritePoint(p);Consol.ReadLine();定定义义接口接口实现实现接口接口中方法中方法接口p作为参数定义Number的实例接口的实现不能用new INUmber,可以用INumber p=new Number(1,2);9.object9.object和和stringstring类型类型object类型对应于NET框架类库中的System.Object类。C
43、#中的所有类型都从这个类型继承;可以把任何类型的值赋给object类型的变量。包装和折包操作所处理的引用类型就是object类型。string类型对应于.NET框架类库中的System.String类,它表示一个Unicode字符串。用户可以直接在字符串类型上执行+、=、!操作,并可以使用操作符,索引从0开始using System;class MyClasspublic I=100;class test public static void Main(string args)object o;o=1;/包装 Console.WriteLine(o);Console.WriteLine(o.G
44、etType();o=new MyClass();MyClass myobj;myobj=(MyClass)o;/拆包Console.WriteLine(myobj.i);char x=“test”2;10.10.数组数组数组是引用类型,从.NET框架类库中的抽象基类System.Array派生。例:int sdArray=new int10;int,mdArray=new int2,4;int sdArray=new int1,3,5,7,9;int,mdArray=new int,1,2,3,4;int sdArray=1,3,5,7,9;/声明和初始化分开 int sdArray;sdA
45、rray=new int1,3,5,7,9;第四章 第1个 windows应用程序 本章要点 概述 创建窗体 设置窗体的属性 处理窗体的事件 对话框 添加菜单 多文档界面 什么是窗体(Form)窗体是Windows桌面应用程序的基本单位窗体主要用于 接收用户的输入 向用户显示信息窗体对象包括 属性(定义窗体外观)方法(定义窗体行为)事件(定义如何同窗体进行交互).NET窗体的应用在.NET框架中 创建Windows桌面应用程序的类在:System.Windows.Forms 程序集 System.Windows.Forms.DllForm类可以创建 标准窗口 工具窗口 无边框窗口 浮动窗口Ob
46、jectMarshalByRefObjectControlScrollableControlContainerControlForm创建窗体使用新建项目模板创建主窗体输入项目名称,项目路径右击Form.csusing System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using System.Data;namespace FirstForm/Form1 的摘要说明。/public class Form1:System.Window
47、s.Forms.Form/必需的设计器变量。/private System.ComponentModel.Container components=null;public Form1()/Windows 窗体设计器支持所必需的/InitializeComponent();/TODO:在 InitializeComponent 调用后添加任何构造函数代码/Windows应用程序需要使用的命名空间缺省:与项目名称相同窗体类Form1是System.Windows.Forms.Form的子类窗体类Form1的构造函数窗体初始化:设置窗体属性创建窗体所包含的控件,设置这些控件的属性添加用户自己的构造函
48、数代码/清理所有正在使用的资源。/protected override void Dispose(bool disposing)if(disposing)if(components!=null)components.Dispose();base.Dispose(disposing);#region Windows 窗体设计器生成的代码/设计器支持所需的方法-不要使用代码编辑器修改/此方法的内容。/private void InitializeComponent()ponents=new System.ComponentModel.Container();this.Size=new System
49、.Drawing.Size(300,300);this.Text=Form1;#endregion指定大纲显示代码块初始化窗体的方法/应用程序的主入口点。/STAThreadstatic void Main()Application.Run(new Form1();调用运行程序的方法Run,建立一个新对象Form1 小 结1.窗体类Form1继承于System.Windows.Forms.Form2.窗体类中一般会自动产生构造函数、初始化窗体、清除窗体资源和程序入口等方法 窗体类中会使用到System.Drawing、1.System.ComponentModel等命令空间中定义的类创建窗体右
50、击项目名称设置窗体属性按类别查看按名称排序查看处理窗体事件把方法关联到Load事件上去事件方法名事件代码两种方法1.直接书写 代码2.双击属性 中的事件,然后书写 事件代码例子:增加双击Form事件对话框对话框是属性为FixedDialog的特殊窗体对话框用于显示信息或接收用户输入显示对话框 ShowDialog方法 模式窗体 有返回值 Show方法 非模式窗体菜单主菜单 MainMenu快捷菜单 ContextMenu 把快捷菜单赋给窗体的ContextMenu属性多文档界面MDI 同时在多个子窗口中对多个文档进行操作SDI 程序在一个时间内,只能打开一个窗口,对一个文档进行操作处理第5章