第27章 WindowscForms编程.pdf
《第27章 WindowscForms编程.pdf》由会员分享,可在线阅读,更多相关《第27章 WindowscForms编程.pdf(35页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、754 第 27 章 Windows Forms 编程 Windows Forms编程 第 27 章 从.NET平台发布(约2001年)以来,基类库中就包含了叫做Windows Forms(包含在System.Windows.Forms.dll 程序集中)的API。Windows Forms工具包提供了一些必要类型用于构建GUI(桌面图形用户界面),创建自定义控件,管理资源(字符串表、图标等)和完成其他与GUI编程有关的编程任务。此外,还有一个叫做GDI+的独立API(包含在System.Drawing.dll程序集中),它提供了额外的类型,允许程序员生成2D图形,与网络打印机进行交互以及操作
2、图像数据。自 在NET 3.5版本中,Windows Forms(和GDI+)的API保留了下来,并且将会继续存在于基类库中(事实上,有可能一直存在)。然而,微软在.NET 3.0中又发布了一系列全新的GUI工具包,叫做WPF(Windows Presentation Foundation)。你将会在下一章开头部分看到,WPF提供了大量功能强大的控件来创建超强的用户界面。然而,本章的重点是介绍传统Windows Forms API的使用,原因很简单,许多GUI程序并不需要WPF提供的强大功能。事实上,对于许多UI程序,用WPF是大材小用了。此外许多已经存在的Windows Forms程序还需要
3、维护。综上所述,你将会从本章学习到Windows Forms的编程模型,Visual Studio 2008对Windows Forms编程的支持,许多Windows Forms控件的使用方法以及用GDI+进行图像编程的大致情况。我们最后会创建一个画图程序(部分功能),并通过此程序把所有的知识点放在一起进行讲解。说明 本书前几个版本花了3章的篇幅来说明Windows Forms API的使用方法。但我们都觉得WPF会成为首选的.NET GUI 开发工具,所以此版本中,我们将只用一章的内容来讲解Windows Forms 和 GDI+。然而,如果你购买了本书,你可以从Apress的网站上免费下载
4、Windows Forms和GDI+以前版本的PDF文件。27.1 Windows Forms 命名空间 Windows Forms由上百个类型(类、接口、结构、枚举和委托)组成,这些类型分散在System.Windows.Forms.dll的各种命名空间中。图27-1通过Visual Studio 2008 的对象浏览器显示了这些命名空间。955 最 重 要 的 命 名 空 间 是System.Windows.Forms,从 一 个 较 高 的 层 次 来 讲,在System.Windows.Forms里的数百个类型可以按下面主要的类型分组。?核心架构。这些类型展现了Windows Form
5、s程序(Form、Application等)的核心操作,还有帮助与传统的ActiveX控件实现互操作性的许多类型。?控件。这些类型用来建立丰富的用户界面(Button、MenuStrip、ProgressBar、DataGridView等),所有这些用户界面都派生自Control基类。控件是在设计时可配置的并 27.2 创建一个简单的 Windows Forms 程序(不用 IDE)755 且(默认条件下)在运行时是可见的。17 18 19 20 21 图27-1 System.Windows.Forms.dll的Windows窗体命名空间 22 24 26 23 25?组件。这些类型不派生自
6、Control基类,但仍然为Windows Forms程序(ToolTip、ErrorProvider等)提供可视特性。许多组件(比如Timer和BackgroundWorker)在运行时是不可见的,但在设计时可以被可视化配置。?公共对话框。Windows Forms为公共操作(OpenFileDialog、PrintDialog、ColorDialog等)提供许多对话框。如果标准对话框不适合需求,你当然可以构建自定义的对话框。在System.Windows.Forms里的类型总数超过了100个,列出Windows Forms家族中的每个成员变量是多余的(还不用说纸的浪费)。(全部细节请参考.
7、NET Framework 3.5 SDK文件)。27.2 创建一个简单的 Windows Forms 程序(不用 IDE)正如你所期望的,现在的IDE(如Visual Studio 2008、C#2008 Express或者SharpDevelop)提供大量的窗体设计器、可视化编辑器和集成的代码生成工具(亦称向导)来方便Windows Forms应用程序的创建。尽管这些工具非常有用,但它们也可能会阻碍我们对Windows Forms的学习,因为这些工具往往会生成大量的样本代码,它们可能会让我们对核心的对象模型比较模糊。因此,我们将用无虚饰的文本编辑器和C#的命令行编译器创建第一个Window
8、s Forms例子(csc.exe的详细使用方式请查看第2章)。27 28 29 30 31 32 32 956首先,创建文件夹SimpleWinFormsApp(建议把它放在C盘的根目录下),打开Vistual Studio 2008 命令提示符,用你所选的文本编辑器,创建一个名为SimpleWFApp.cs的文件。在新文件中输入下面的代码,并且把它保存在SimpleWinFormsApp文件夹中。/必需的命名空间。using System;using System.Windows.Forms;namespace SimpleWFApp /这是我们的应用程序对象。class Program
9、static void Main()Application.Run(new MainWindow();756 第 27 章 Windows Forms 编程 /这是我们的主窗口。lass MainWindow:Form c 这些代码表示的是一个最简单的Windows Forms应用程序。我们至少需要一个扩展了Form基类的类和一个Main()方法用于调用静态的Application.Run()方法(关于Form和Application的更多细节将会出现在本章的后续内容中)。你可以用下面的命令来编译此程序(记得第2章中默认的输出文件csc.rsp吗?它 会 自 动 引 用 许 多.NET 程 序
10、 集,包 括 System.Windows.Forms.dll 和System.Drawing.dll:c sc/target:winexe*.cs 说明 从技术上讲,可以在命令行下用/target:exe选项建立一个Windows应用程序;然而,如果这么做,将发现一个命令窗口隐藏在后台(它将一直存在,直到你关闭主窗口)。当指定/target:winexe时,执行文件运行起来如同一个原生的Windows窗体应用程序(没有隐藏的命令窗口)。957 运行应用程序,将会看到一个尺寸可变的、可最小化、可最大化和可关闭的置顶窗口(如图27-2所示)。就算如此,这个程序并不是很激动人心,但是它很好地说明了
11、Windows Forms应用程序可以如此简单。为了使我们的程序更好地说明问题,我们将会在MainWindow类型中增加一个自定义构造函数,以允许调用者设置将要显示的窗口的各种属性。图27-2 简单的Windows Forms应用程序 例如:/这是我们的主窗口。class MainWindow:Form public MainWindow(string title,int height,int width)/在父类中设置各种属性。Text=title;Width=width;Height=height;/使窗口居中的继承方法。CenterToScreen();现在我们可以更新对Applicat
12、ion.Run()的调用,如下:static void Main()Application.Run(new MainWindow(My Window,200,300);尽管我们向胜利迈出了一步,但是一个符合要求的窗口需要各种用户界面元素(菜单系统、状态栏、按钮等)以允许输入。为了理解Form的派生类型如何包含这些元素,你必须理解Controls属性和基础控件集合的作用。27.2 创建一个简单的 Windows Forms 程序(不用 IDE)757 27.2.1 填充控件集合 17 18 19 System.Windows.Form.Control基类(处于Form类型的继承链中)定义了一个名
13、为Controls的属性。此属性包装了一个叫做ControlsCollection的嵌套在Control类中的自定义集合,这个集合(正如其名)引用每个由派生类型维护的UI元素。和其他容器一样,此类型支持许多用来插入、移除、寻找给定UI控件的方法(如表27-1所示)。表 27-1 ControlCollection成员 成 员 作 用 20 21 用来把新的Control派生类型(或类型数组)添加到集合中 Add()、AddRange()Clear()移除集合中的所有元素 Count返回集合中元素的个数 GetEnumerator()返回此集合的IEnumerator接口 Remove()、Re
14、moveAt()用来移除集合中的一个控件 22 24 26 23 25 958 当你希望填充Form派生类型的UI时,只需要遵循如下步骤即可:?在Form子类中,定义一个指定UI元素的成员变量;?配置UI元素的外观;?通过调用Controls.Add()把UI元素添加到窗体的ControlsCollection容器中。假如你希望更新MainWindow类来支持FileExit菜单系统。相关的更新代码如下:class MainWindow:Form /用来构建简单菜单系统的成员。private MenuStrip mnuMainMenu=new MenuStrip();private ToolS
15、tripMenuItem mnuFile=new ToolStripMenuItem();private ToolStripMenuItem mnuFileExit=new ToolStripMenuItem();public MainWindow(string title,int height,int width)27 28 29 30 31 32 32 ./用来创建菜单系统的方法。BuildMenuSystem();private void BuildMenuSystem()/把File菜单项添加到主菜单中。mnuFile.Text=&File;mnuMainMenu.Items.Add(
16、mnuFile);/把Exit菜单添加到File菜单中。mnuFileExit.Text=E&xit;mnuFile.DropDownItems.Add(mnuFileExit);mnuFileExit.Click+=new System.EventHandler(this.mnuFileExit_Click);/最后,把这些菜单添加到窗体中。Controls.Add(this.mnuMainMenu);MainMenuStrip=this.mnuMainMenu;/处理File|Exit事件。private void mnuFileExit_Click(object sender,Event
17、Args e)758 第 27 章 Windows Forms 编程 Application.Exit();首先,你应该注意到MainWindow类型中现在维护了3个新的成员变量。MenuStrip类型表示菜单系统的整体,ToolStripMemuItem表示宿主支持的最顶端的菜单项(如File)或子菜单项(如Exit)。说明 如果你还在用早期版本的Windows Forms(1.0或1.1),你可能会用MainMenu来容纳许多MenuItem对象。MenuStrip控件(.NET 2.0中引入的)与MainMenu的作用相似,但Menustrip可以包含的控件不仅限于“普通的菜单项”(如组
18、合框、文本框等)。959 此菜单系统在BuildMenuSystem()辅助函数中进行配置。注意每个ToolStripMenuItem的文本是通过Text属性进行设定的,每个名字都包含一个“&”字符。正如你所知道的那样,这个符号用来设定Alt快捷键,因此按Alt+F将会选中File菜单,按Alt+X将会选中Exit菜单。同时应该注意File StripMenuItem对象(mmnFile)通过DropDownItems 属性来添加子菜单,而MenuStrip对象通过Items属性来添加最顶端菜单。菜单系统创建完成后,它将会被添加到控件集合中(通过Controls属性),此后,我们把MenuSt
19、rip对象添加到继承的MainMenuStrip属性中。虽然这一步看起来是多余的,但是拥有诸如MainMenuStrip这样的特殊属性可以动态地根据特定的用户建立菜单系统,这样做大概出于用户喜好或安全设置的考虑。现在还有唯一一个比较有意思的事情就是,我们要处理FileExit的Click事件以捕获用户选择这个子菜单的操作。Click事 件 的 运 行 是 与 标 准 的 委 托 类 型System.EventHandler一起完成的。此事件只能调用System.Object作为第一个参数,System.EventArgs作为 第 二 个 参 数 的 方 法。在 这 里,委 托 的 目 标(mn
20、uFileExit_Click)是 通 过 调 用Application.Exit()方法来关闭整个Windows应用程序。图27-3 一个带有菜单系统的简单窗口 一旦此应用程序被编译和运行,你就会得到一个简单的自定义菜单系统(如图27-3所示)。27.2.2 System.EventArgs和System.EventHandler的作用 System.EventHandler是在事件处理过程中用于Windows Forms(和APS.NET)API的一种委托类型。如你所见,此委托只能指向第一个参数是System.Object类型的方法,此参数代表触发事件的类型。例如,我们打算改写mnuFil
21、eExit_Click()方法的实现,代码如下:private void mnuFileExit_Click(object sender,EventArgs e)MessageBox.Show(string.Format(0 sent this event,sender.ToString();Application.Exit();我们可以确定是mnuFileExit触发了事件,因为在消息框中显示了字符串。E&xit sent this event 27.3 Visual Studio Windows Forms 项目模板 759 你可能很想知道第二个参数System.EventArgs是做什么
22、用的。事实上System.EventArgs只是继承了Object对象,并且提供了一些额外的功能。17 18 public class EventArgs public static readonly EventArgs Empty;static EventArgs();public EventArgs();19 960 然而,在全部的.NET事件处理中,此类型非常有用,它将会有许多其他的派生类型(同样非常有用)。例如,通过扩展EventArgs,MouseEventArgs提供了关于鼠标当前状态的细节。同样通过扩展EventArgs,KeyEventArgs提供了键盘状态的细节(例如按了哪个
23、键),PaintEventArgs提供了与图形相关的数据,诸如此类。你将会看到许多继承于EventArgs的类型(和使用它们的委托),不仅是在Windows Forms中,而且还会在WPF和ASP.NET API中。20 21 许多情况下,只用简单的文本编辑器就可以把越来越多的功能加入到MainWindow中(如:状态栏、对话框等),但是最终我们会累到手抽筋,因为我们还不得不手动配置许多控件的逻辑。好在Visual Studio 2008提供了许多集成的设计器,可以替我们关照这些细节。在本章余下的部分,我们将使用它来创建C#代码。它们其实并不神奇。22 24 26 23 25 源代码 Simp
24、leWinFormsApp项目的源代码位于chapter 27子目录下。27.3 Visual Studio Windows Forms 项目模板 如果要使用Visual Studio 2008 的Windows Forms设计器,首先要通过FileNew Project菜单选项选择Windows Application项目模板。为了得到丰富的Windows Forms设计器工具,创建一个新的应用程序SimpleVSWinFormsApp(如图27-4所示)。27 28 29 30 31 32 32 760 第 27 章 Windows Forms 编程 图27-4 Visual Studio
25、 Windows Forms项目模板 96127.3.1 可视化设计器界面 在我们开始创建更有趣的Windows应用程序之前,将会使用设计器工具重建此前的示例。首先创建一个新的Windows Forms项目,你将会注意到Visual Studio 2008 展现一个允许你拖放控件的设计器界面。在这个设计器中,可以配置窗口的初始大小,也可以通过拖动改变窗口的大小(如图27-5所示)。当配置窗体或放置在窗体中的控件的外观时,将会用到属性窗口。此窗口可以被用来设置某个的属性值和建立事件处理程序。将许多控件放置在设计器界面上以后,就可以通过属性窗口上的下拉框来选择不同的控件。由于当前的窗口没有内容,因
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第27章 WindowscForms编程 27 WindowscForms 编程
限制150内