C第6章窗体、控件和组件.ppt
《C第6章窗体、控件和组件.ppt》由会员分享,可在线阅读,更多相关《C第6章窗体、控件和组件.ppt(144页珍藏版)》请在三一办公上搜索。
1、第6章 窗体、控件和组件,6.1 窗体与对话框6.2 控件共有的基本操作6.3 容器类控件和组件6.4 文本操作类控件6.5 选择操作类控件6.6 图像操作类控件和组件6.7 菜单、工具栏与状态栏6.8 视图操作类控件6.9 其他常用控件,界面设计举例1-动物的故事(KeyboardAndEventExample),界面设计举例2-打飞鸟(DownBird),界面设计举例3-Vista图片变换效果(vistaPictureBoxExample),界面设计举例4-XP风格的window窗体(SplitContainerExample),Window应用程序的生命周期,所谓“应用程序”,就是一个进
2、程。假设只有一个线程,即主线程。主线程逐句执行线程体的代码,当执行完之后,程序结束,进程空间释放。,static void Main()Console.WriteLine(Hello,World!);Console.WriteLine(This is a demo!);Console.WriteLine(writen by xialuning!);,主线程体执行完了,进程退出。控制台窗口也随之消失。,窗体应用程序,窗体应用程序,为什么一直存在而不消失(除非显式点击关闭按钮)?“窗体”大概可以分为前台和后台两个部分。从前台来讲,“窗体”是一个可见的窗口”;从后台来讲,“窗体”是一个消息循环。,p
3、rotected override void WndProc(ref Message m)switch(m.Msg)case WM_COMMAND:.break;case WM_CLOSE:.break;base.WndProc(ref m);,消息循环(消息泵):主线程不停的尝试接收来自Windows系统的消息;当有消息到来时,就处理;无消息到来,无限等待;WM_CLOSE或WM_DESTROYWINDOW等消息到来时,主线程结束。,消息循环(了解),Windows是以消息驱动的操作系统,Windows 消息提供了应用程序与应用程序以及应用程序与Windows系统之间进行通讯的手段。Wind
4、ows 中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个“消息队列”,即应用程序队列,用来存放该程序可能创建的各种窗口的消息。应用程序中含有一段称作“消息循环”的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中。Windows 应用程序创建的每个窗口都在系统核心注册一个相应的窗口函数,窗口函数程序代码形式上是一个巨大的switch 语句,用以处理由消息循环发送到该窗口的消息,窗口函数由Windows 采用消息驱动的形式直接调用,而不是由应用程序显示调用的,窗口函数处理完消息后又将控制权返回给Windows。,窗体应用程序与控制台应用程序,控制台
5、程序没有消息循环(假如不在控制台程序中使用窗体),主线程代码依次执行后就结束 控制台程序适于代码验证和代码功能演示,执行一段代码,然后在控制台输出结果。窗体应用程序在后台使用消息循环来运作,前台使用窗体控件来提供用户交互界面。,Windows应用程序中的Program.cs文件,特性描述,使应用程序能够与COM组件进行互操作;,启动应用程序,显示窗体Form1,6.1 窗体与对话框,1、窗体应用程序的启动和停止使用Application类提供的静态方法来启动、停止应用程序。Application类提供的方法:Run方法:调用 Run 以便在当前线程上启动应用程序消息循环,并可以选择使某窗体可见
6、。Exit或ExitThread方法:用于停止消息循环。DoEvents方法:用于在程序处于某个循环中时处理消息。调用 AddMessageFilter 以向应用程序消息泵添加消息筛选器来监视 Windows 消息。IMessageFilter 可以阻止引发某事件或在调用某事件处理程序前执行特殊操作。,当运行 Windows 窗体时,它将创建新窗体,然后该窗体等待处理事件。该窗体在每次处理事件时,均将处理与该事件关联的所有代码。所有其他事件在队列中等待。在代码处理事件时,应用程序并不响应。例如,当将另一窗口拖到该窗口前面时,该窗口不重新绘制。如果在代码中调用 DoEvents,则您的应用程序可
7、以处理其他事件。例如,如果您有向 ListBox 添加数据的窗体,并将 DoEvents 添加到代码中,那么当将另一窗口拖到您的窗体上时,该窗体将重新绘制。如果从代码中移除 DoEvents,那么在按钮的单击事件处理程序执行结束以前,您的窗体不会重新绘制。,6.1 窗体与对话框,窗体的常用方法和事件,6.1.2 窗体的创建、显示与隐藏,1、如何在代码中打开一个新窗体 Form2 fm=new Form2();fm.Show();/或者fm.ShowDialog();注意Show()和ShowDialog()区别;2、如何在代码中关闭一个窗体 用法1:fm.Close();用法2:this.Cl
8、ose();用法3:Application.OpenFormsForm1.Close();OpenForms是当前应用程序中,所有已创建、未释放的窗体的集合;若当前窗体是应用程序的主窗体,则在关闭当前窗体的同时,直接退出应用程序;,3、如何隐藏一个打开的窗体(1)隐藏当前窗体:this.Hide();(2)隐藏其它窗体:Application.OpenFormsForm1.Hide();隐藏窗体是使窗体不可见,但该窗体所占用的资源并没有被释放,随时可以通过调用该窗体的Show方法将其显示。4、如何重新显示隐藏的窗体(1)显示当前窗体:this.Show();(2)显示其它窗体:Applicat
9、ion.OpenForms“Form1”.Show();/显示Form1窗体,6.1.2 窗体的创建、显示与隐藏,5.选择启动窗体 启动窗体可以根据需要进行设置或更改,在“解决方案资源管理器”中打开Program.cs文件,若要使项目中的Form2窗体成为启动窗体,在Main方法中将Form1修改为Form2即可,代码如下:static void Main()Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new Form2();,6.1.
10、2 窗体的创建、显示与隐藏,6关闭应用程序Application.Exit();退出当前应用程序,关闭该应用程序中的所有窗体;关闭窗体时,该窗体所占用的资源也会被释放,6.1.2 窗体的创建、显示与隐藏,关闭多个窗体(Application.OpenForms),int count=Application.OpenForms.Count;for(int i=count-1;i=0;i-)if(Application.OpenFormsi.Name=Form2)Application.OpenFormsi.Close();,但是不能使用如下形式:for(int i=0;i count;i+)(A
11、pplication.OpenFormsi.Name=Form2)Application.OpenFormsi.Close();原因在于每关闭一个窗体之后通过Application.OpenForms所获取属于应用程序的打开窗体的集合就会发生变化,导致索引引用超出范围。,关闭多个窗体(Application.OpenForms),6.1.2 窗体的创建、显示与隐藏,【例6-1】演示窗体的基本用法以及如何显示和关闭窗体。部分运行效果如图:,C#中的InitializeComponent()方法,在每一个窗体生成的时候,都会针对于当前的窗体定义InitializeComponent()方法,该方法
12、实际上是由系统生成的对于窗体界面的定义方法。在每一个Form文件建立后,都会同时产生程序代码文件.CS文件,以及与之相匹配的.designer.cs文件,业务逻辑以及事件方法等被编写在.CS文件之中,而界面设计规则被封装在.Designer.CS文件里。,在.designer.cs代码之中,可以很容易发现InitializeComponent()方法和Dispose()方法,前者为界面设计的变现内容,后者为表单释放系统资源时候执行编码。InitializeComponent()方法反映了窗体设计器中窗体和控件的属性。如果更改InitializeComponent()方法中的相关属性参数,相应的
13、变化在窗体设计器界面上也会显示出来。Form1.Designer.cs 里的是定义(函数名后面有大括号包含定义内容)Form1.cs 里的是调用(函数名后面分号结尾),C#中的InitializeComponent()方法,注意:InitializeComponent()方法写在前面和后面是有区别的。InitializeComponent()方法是用来初始化窗体组件的,在InitializeComponent之前,窗体的各个控件还没有进行初始化,比如说窗体上有一个TextBoxUserName,在InitializeComponent()之前它还只是一个TextBox类型的变量而已,如果在In
14、itializeComponent()之前调用这个TextBox的属性或方法,就会出错。,C#中的InitializeComponent()方法,6.1.3 窗体常用的属性,HelpButton属性 如果当ControlBox=true;MaxmizeBox=false;MinimizeBox=false;而 HelpButton=true 时就可以看到有个帮助的按钮出现在关闭按钮旁边。,6.1.3 窗体常用的属性,6.1.4 窗体常用属性,设置窗体属性的途径有2种:在设计模式下利用【属性】窗口设置窗体属性。在代码编辑模式下设置窗体属性。补充例题2(FormSetExample),6.1.4
15、窗体位置及外观控制,StartPostion:获取或设置运行时窗体的起始位置,一般在构造函数中设置此属性。注意位置语句必须写在构造函数中。例如:this.StartPosition=FormStartPosition.Manual;this.Location=new Point(screenX,screenY);通过设置窗体的【ControlBox】属性为“True”或者“False”,可以控制是否显示最大化、最小化以及关闭按钮。除此之外,还可以通过设置窗体的【FormBorderStyle】属性控制窗体的边框样式.,设置窗体起始位置,需要首先了解计算机屏幕的坐标系。和通常的坐标系起始点不同,
16、计算机屏幕坐标系原点位于屏幕左上角。其X轴水平向右,Y轴垂直向下。以计算机屏幕分辨率为800600为例,其X轴最大值为800像素,Y轴最大值为600像素。,6.1.4 窗体位置及外观控制,6.1.4 窗体位置及外观控制,【例6-2】演示如何控制窗体的显示位置以及如何控制窗体的外观形状。设计视图如下:,运行效果如下:,load()事件在第一次显示窗体前发生,可以使用此事件执行一些任务,如分配窗体使用的资源。,6.1.4 窗体位置及外观控制,6.1.5 单文档窗体和多文档窗体,单文档窗体:窗体体之间相互独立;多文档窗体(Multi-Document Interface,MDI)在一个主窗体中,可以
17、包含一个或多个子窗体;主窗体必须设置IsMDIContainer属性为true;子窗体设置MdiParent属性,指向主窗体;主窗体称为MDI父窗体,子窗体称为MDI子窗体;若要设置主窗体中各子窗体的排列方式,可使用主窗体的LayoutMdi方法,其值设置为MdiLayout枚举值之一;例如,Microsoft Word、Microsoft Excel等就是多文档界面(MDI)应用程序。,系统包含三种样式窗体:单文档界面(SDI):例如,Microsoft Windows 中包括的“写字板”应用程序就是SDI类型的界面。在“写字板”中,只能打开一个文档;打开另一个文档自动关闭一个已经打开的文档
18、。例如,Microsoft Windows 中包括的“写字板”应用程序就是SDI类型的界面。在“写字板”中,只能打开一个文档;打开另一个文档自动关闭一个已经打开的文档。,6.1.5 单文档窗体和多文档窗体,(2)多文档界面(Multi-Document Interface,MDI)是指在一个主窗体中可以包含一个或多个子窗体的窗体,主窗体称为MDI父窗体,子窗体称为MDI子窗体。主窗体必须设置IsMDIContainer属性为true;子窗体设置MdiParent属性,指向主窗体;,6.1.5 单文档窗体和多文档窗体,为了排列子窗体,用 LayoutMdi()方法为 MDI 父窗体设置 MdiL
19、ayout 枚举。其枚举值如下表所示。,6.1.5 单文档窗体和多文档窗体,补充例题3:MDI窗体用法,【例6-3】演示MDI窗体的基本用法以及如何显示和关闭子窗体运行效果如下(MDIExample):,补充例题3:MDI窗体用法,6.1.6 对话框,对话框用于与用户交互和检索信息;对话框(ShowDialog打开的窗体)都具有返回值;DialogResult枚举值:None、OK、Cancel、Yes和No。对话框分为标准对话框和自定义对话框。MessageBox对话框利用静态Show方法来显示消息对话框;ColorDialog、FontDialog对话框提供颜色、字体选择;自定义窗体对话框
20、设计方法与设计一般窗体基本相同,但要做特殊的处理。,1、MessageBox对话框的Show方法,Show(string text)Text给出在消息框中显示的文本;Show(string text,string caption)caption指定消息框的标题栏中显示的文本;Show(string text,string caption,MessageBoxButtons buttons,MessageBoxIcon icon)MessageBoxButtons枚举值有OK、OKCancel、YesNoCancel和YesNo。MessageBoxIcon枚举值有None(不显示图标)、Han
21、d(手形)、Question(问号)、Exclamation(感叹号)、Asterisk(星号)、Stop(停止)、Error(错误)、Warning(警告)和Information(信息)。,2、ColorDialog、FontDialog对话框,提供颜色、字体选择的对话框。调用方法:ShowDialog()返回值:DialogResult类型举例ColorDialog colorDlg=new ColorDialog();if(colorDlg.ShowDialog()=DialogResult.OK)textBox1.ForeColor=colorDlg.Color;,ColorDial
22、og、FontDialog对话框,默认情况下,“字体”对话框显示字体、字体样式和字体大小的列表框、删除线和下划线等效果的复选框、字符集的拉列表以及字体外观等选项。图标为“”。FontDialog组件常用属性、方法和事件及说明如下页表所示。,6.1.6 对话框,6.1.6 对话框,6.1.6 对话框,6.1.6 对话框,自定义窗体对话框的设计方法与设计一般窗体基本相同,不同之处是还要对自定义窗体对话框作如下处理:将窗体的【FormBorderStyle】属性更改为“FixedDialog”将窗体的【MaximizeBox】属性、【MinimizeBox】属性和【ControlBox】属性设置为“
23、False”在窗体上放一个“确定”按钮,一个“取消”按钮。然后将窗体的【AcceptButton】属性设置为“确定”按钮,【CancelButton】属性设置为“取消”按钮。在按钮事件中,设置DialogResult类型的返回值,以便让对话框隐藏起来,6.1.6 对话框,【例6-4】自定义窗体对话框的用法。设计视图如下:,运行效果如下:,补充:窗体间值的传递,1、通过构造函数特点:传值是单向的(不可以互相传值),实现简单。在窗体Form2中 int value1;string value2;public Form2(int value1,string value2)InitializeComp
24、onent();this.value1=value1;this.value2=value2;在窗体Form1中这样调用 new Form2(111,222).Show();/这样就把111,222,这2个值传送给了Form2,2.通过静态变量特点:传值是双向的,实现简单。例如:比如在窗体Form1中定义一个静态成员value在窗体Form1中这样调用 From1.value=f2;/给静态成员赋值new Form2().Show();/显示Form2在窗体Form2中 this.Text=From1.value;/取回app.value的值From1.value=Form2;/给app.val
25、ue赋值,以便其他窗体调用,补充:窗体间值的传递,3.通过窗体的公有属性值特点:实现简单在窗体Form2中定义一个公有属性Form2Value,获取和设置textBox1的文本值public string Form2Value get return this.textBox1.Text;set this.textBox1.Text=value;在窗体Form1中这样调用 Form2 f2=new Form2();f2.Form2Value=Ok;/给Form2的textBox1赋值Okf2.ShowDialog();,补充:窗体间值的传递,4.通过窗体的公有属性值和Owner属性特点:实现简单
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 窗体 控件 组件
链接地址:https://www.31ppt.com/p-6183223.html