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