编程的奥秘.pdf

上传人:qwe****56 文档编号:70015762 上传时间:2023-01-14 格式:PDF 页数:91 大小:2.29MB
返回 下载 相关 举报
编程的奥秘.pdf_第1页
第1页 / 共91页
编程的奥秘.pdf_第2页
第2页 / 共91页
点击查看更多>>
资源描述

《编程的奥秘.pdf》由会员分享,可在线阅读,更多相关《编程的奥秘.pdf(91页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、 第 2 章.NET 程序设计基础 第 1章介绍了如何使用 VS.NET 开发简单的 Windows Form应用程序,读者对.NET 程序的运行原理应有了初步的了解。在本章中将进一步介绍更多的Windows Form控件,使您能设计更为复杂的用户界面。接着,将介绍如何使用 VB.NET 语言来编程,这将使您初步迈入.NET 编程的世界。然后,从实用角度介绍一个文本编辑器MyEditor的开发过程。学完本章并认真完成所有程序开发实践活动,读者将会具备基本的Windows Form开发能力,可以编写一些小型的应用程序。2.1 使用 VS.NET设计用户界面 用户界面(User Interface

2、,UI)是一个软件技术的专用术语。通俗地说,用户界面就是程序的使用者可以看到的程序外观,对于运行于个人电脑上的程序而言,用户界面指的就是程序的窗体(Form)。图 2-1 是著名的MP3 播放软件WINAMP的用户界面。在.NET 下,运行在个人电脑上的应用程序由“Windows Form”类型的项目生成。Windows Form类似于以前使用 VB 6、Delphi、VC 6开发出来的窗体,其特点是拥有丰富的用户交互功能,比如可以最大化、最小化,可以通过拖动标题栏而拖动整个窗体,单击窗体左上角图标会弹出系统菜单,按 Alt+F4组合键可以关闭 当 前 窗 体 Windows Form 通 过

3、 调 用.NET Framework 和 Windows 操作系统的 API(Application Programming Interface,应用程序编程接口),还可以方便地使用操作系统所提供的任意功能。在.NET 下,还有另外一种用户界面,称之为“Web Form”。一看见“Web”,读者一定就会猜出这是运行在因特网上的窗体。其实 Web Form本身就是 Web 网页,它不能像 Windows Form一样独立存在,而只能运行在浏览器(比如微软的 Internet Explorer)中。为什么要把“网页”叫做“Web Form”呢?Web Form与传统的使用HTML设计的网页有何不同

4、?经常上网的人都知道网页页面和标准的Windows 窗体还是有许多差别的。Web 页面由于必须显示在浏览器中,所以其功能受到浏览器的限制,无法做到像标准的Windows 窗体那样功能强大而且使用方便。例如,按照目前的技术水平,要开发一个全部运行在浏览器中的图像处理软件(如Photoshop)是很困难的,不管是程序运行速度还是用户操作友好性,都受到 HTML 及浏览器的天然限制。Windows Form主要运行在单机上,而 Web Form主要运行在因特网环境中,这两种差 图 2-1 MP3 播放器的用户界面 31.N E T技术大系 第 2 章 .N E T 程序设计基础 异极大的环境决定了两

5、者的不同。但微软公司一直在努力弥合开发Web 应用程序和桌面应用程序之间的差别,Web Form就是把 Windows Form的事件驱动原理应用于开发因特网应用程序的一种尝试。在.NET 下,开发因特网应用程序(即 Web 网站)的技术称为 ASP.NET。在 ASP.NET 中,把 Web 页面看成是一个窗体,可以像开发Windows Form应用程序一样,直接用控件在网页上“画”出网页布局,并可以针对各种控件的事件进行编码。正是由于在ASP.NET中设计Web网页与设计Windows Form几乎一样,所以,ASP.NET 中把 Web 网页称为“Web Form”。提示 初学.NET

6、的人不适合一上来就直接学习 ASP.NET。由于 Web Form是在 Windows Form技术的基础上并结合了现有的 Web网站开发技术出现的更为复杂的新技术,所以,学习掌握 Windows Form的基本原理,掌握一种.NET 语言(推荐 C#和 VB.NET 两者之一)编程技能是学习 ASP.NET技术的基础。初学者切不可一开始就抱着本C#Web Form编程之类的书狂啃不休,不掌握必要的基础,您会发现学到一定的时候就学不下去了。学习 ASP.NET 的另一个基础是掌握现有的 Web 开发技术,主要是 HTML 和 JavaScript,以及 Web应用程序的基本原理。本书所有内容只

7、涉及 Windows Form技术,读者如果对开发因特网应用程序感兴趣,可以在学习本书之后,再去学习ASP.NET。本章介绍Windows Form的基本原理,并学习使用 VS.NET 这一功能强大的集成开发环境高效地设计用户界面。2.1.1 窗体的使用 Windows Form应用程序的核心就是窗体(Form),先看一个示例。1类和命名空间 打开 VS.NET,从“文件”菜单中选“新建/项目”,如图 2-2所示。图 2-2 新建一个 Windows 应用程序 注意选中“Visual Basic 项目”下的“Windows 应用程序”模板,在名称处输入“UseForm”。单击【确定】按钮,VS

8、.NET 将会自动创建一个窗体,显示在屏幕中央。请切换到代码视图(参见第 1章中的相关内容),观察 VS.NET 自动生成的代码框架。Public Class Form1 Inherits System.Windows.Forms.Form 32.N E T技术大系 编程的奥秘 此处略去 Windows窗体生成器生成的代码 End Class 从上述代码中可以看到窗体其实是一个类,名字叫做“Form1”。在.NET 中编程用到的所有东西都放在特定的类中,类是所有面向对象程序中最基本的具有独立性的构成元素(在以 C语言为代表的计算机语言开发出来的结构化程序中,最基本的构成元素是函数)。2.2 节

9、将介绍面向对象编程的更多知识。注意上述代码中的第 2 句,“Inherits”是 VB.NET 中的一个关键字(Key Word,即编程语言中表达特殊意义的单词),它表明类 Form1 从另一个类 System.Windows.Forms.Form继承而来,这个类由.NET Framework 提供,它其中有许多已写好的程序代码,这些代码能完成前面提到的标准Windows 窗体应该具有的功能(比如让窗体最大化和最小化)。通过继承这些现有代码,软件工程师就不再需要自己实现这些功能,而只需使用现成的类,这就是面向对象编程所带来的高开发效率。把许许多多完成各种功能的类集中放在一起,就构成了类库(Cl

10、ass Library)。.NET 就提供了一个庞大的类库,参见图 2-3。图 2-3 .NET Framework 基本类库 读者可能会觉得奇怪,类名字“Form1”只有一个单词,为什么它继承的类有那么长的以英文句点分隔的字符串“System.Windows.Forms.Form”?这就涉及.NET 类库中类的组织方式问题。在.NET Framework 中,类的存放不是杂乱无章的,而是分门别类的,比如开发 Web 网页的类就放在 System.Web 这个大类别下。相应地,用于开发 Windows Form 的类就放在 System.Windows.Forms 这个大类别下。诸如 Syst

11、em.Windows.Forms 这样的大类别称为名字空间(Name Space),可以把名字空间看成是功能彼此类似或相关的类的集合。名字空间是可以嵌套的,大的可以装下几个小的,比如 System这个顶级的名字空间下就可以有 Web、Data、XML 等几个小的名字空间,而 Runtime 这个名字空间下还有 Remoting、Serialization等好几个子名字空间。嵌套的名字空间形成一个复杂的分层结构,最底层是具体的类。当需要明确地表达一个类时,应采用以下格式:最大的名字空间.子名字空间.孙名字空间.类 最右边的是类名,所以,“System.Windows.Forms.Form”这个字

12、符串表明 Form是一个类,它InteropServices Runtime Remoting Serialization System.Web System.Data System.Windows.Forms System.Drawing System.XML System Collections Configuration Diagnostics Globalization IO Net Reflection Resources Security ServiceProcess Text Threading 33.N E T技术大系 第 2 章 .N E T 程序设计基础 的最顶级名字空间是

13、 System,次级名字空间为 Windows,三级名字空间为Forms。通过使用这样的完整字符串,就可以在庞大的类库中快速定位一个类。为了不在编程时输入一个长长的字符串,VB.NET 引用了一种“提前”导入名字空间的 Imports语句。在代码窗口的最上方输入 Imports System.Windows.Forms 然后,就可以把代码中的 Inherits System.Windows.Forms.Form 改为 Inherits Form 则程序仍然会正确运行。这种在代码开头使用 Imports 语句导入特定名字空间的方法在编写代码时是非常常见的。在后面的章节中,许多实例都采用了提前导入

14、名字空间的方法。读者在手动敲入代码时如果发现VS.NET 提示“未定义类型 XXX”(参见图 2-4),则往往是由于没有导入名字空间的缘故。图 2-4 未定义名字空间引发的错误 解决方法是在类代码之外使用Imports 语句导入名字空间,如图 2-5所示。可以在随机文档MSDN 中查找.NET Framework中所有类各自所属的名字空间。图 2-5 导入名字空间解决“类型未定义”错误 试一试 在 MSDN中查找 StreamReader这个类属于哪个名字空间。2类和由类创建的对象 前面说过,Form1 其实是一个类,但我们看到的窗体并不是类本身,而是由 Form1 类生成的对象。类和对象两者

15、是一种什么关系?为理解这一点,我们进行一个练习。把一个按钮拖动到窗体(窗体名 Form1)上,在其 Click事件代码中书写以下代码:Private Sub Button1_Click(ByVal sender As System.Object,_ ByVal e As System.EventArgs)Handles Button1.Click Dim frm As New Form1 34.N E T技术大系 编程的奥秘 frm.ShowDialog()End Sub 运行之后,多次单击按钮,看看发生了什么(参见图 2-6)!可以看到,每次单击按钮都会在屏幕上多出一个窗体,并且这些窗体都“

16、长得”一模一样。这说明了什么?类 Form1 定义了窗体的外观,但真正看到的是以 Form1作为模板创建的Form1 对象。一个类可以创建多个以它为模板的对象,类和对象之间是一对多的关系。为了便于理解,可以把类看成是一个印,它可以在纸上盖出多个章,盖出的章就是“对象”,不管盖多少次,印本身是不会变的,盖出来的章样子也是类似的。理解类和由类创建的对象这两个概念非常重要,2.2节将学习类的更多知识。上述代码中使用New 这个关键字创建类 Form1 的对象 frm,再调用 frm对象的 ShowDialog()方法让它显示出来。一个对象可以拥有属性和方法,属性往往代表了对象的性质,而方法往往代表了

17、对象的功能。Form1 对象的 ShowDialog()方法完成的功能是把窗体显示出来,并等待用户关闭。一个对象拥有多少种属性和方法是由类来决定的。读者可能会奇怪,在类 Form1 的代码中,没有看见有ShowDialog()这样单词啊?它从哪儿冒出来的?别忘了,Form1 继承自 Form类,而 ShowDialog()这个方法的功能由Form 类所实现,具体的代码放在.NET Framework中,在 VS.NET 中不能直接看到。3Form 类的常用属性 熟悉 Windows 操作的人都知道,一个标准的窗口有很多特性,而 System.Windows.Forms.Form作为所有可见窗体

18、的父类,实现了标准的 Windows 窗体的所有功能,这主要是通过设置 Form类的特定属性值实现的,许多属性可以用属性窗口进行设置。以下是使用代码来设置这些属性的方法(假设所有的代码都位于同一窗体,用关键字 Me 代表窗体):(1)修改窗体标题 Me.Text=新窗体标题 试一试 在 Form_Load()过程中加上以上代码,然后编译运行。(2)隐藏窗体 Me.Visible=False 将其改为True 则会再显示窗体。(3)设置窗体背景颜色 Me.BackColor=Color.Yellow 以上代码把窗体背景改为黄色。请注意在.NET 中颜色用 System.Drawing 名字空间中

19、的 Color 类型表示,其完整的声明为“System.Drawing.Color”。图 2-6 显示的多个窗体 35.N E T技术大系 第 2 章 .N E T 程序设计基础.NET 提供了许多种预先定义的颜色,如上面的代码所示,可以使用以下的方式指定一种预定义颜色:Color.颜色名称 如果预定义颜色不能满足需要,则可以通过指定 RGB 值来定义一种特殊的颜色。RGB 分别代表 Red(红色)、Green(绿色)、Blue(蓝色)三个分量,每个分量的取值范围是 0255。从色彩学可以知道,红、绿、蓝是三原色,这三种颜色按不同的比例混合,可以生成人肉眼能看到的几乎所有颜色。在计算机上,每个

20、颜色有 256 种取值,所以,一共能表示“256256256”种颜色。对于纯色有以下公式:(R,G,B)=(255,0,0)纯红色(R,G,B)=(0,255,0)纯绿色(R,G,B)=(0,0,255)纯蓝色(R,G,B)=(255,255,255)纯白色(R,G,B)=(0,0,0)纯黑色 如果使用 RGB 的方式来选定颜色,可以使用 Color类型的 FromARGB()方法:Me.BackColor=Color.FromArgb(255,0,0)以上代码把窗体背景颜色改为红色。试一试 在 Form_Load()过程中加上以上代码,然后编译运行,改改 RGB 的值,看看效果。(4)让窗体

21、不能动态改变大小 Me.FormBorderStyle=FormBorderStyle.FixedSingle 试一试(1)在 Form_Load()过程中加上以上代码,然后编译运行;(2)将 FormBorderStyle 设为其他值,再运行看看结果;(3)在代码窗口中选中 FormBorderStyle,然后按 F1 键,调出 MSDN,了解 MSDN 对这一属性的描述;(4)让窗体在启动时在屏幕上自动居中。只需设置窗体的StartPosition 属性即可。Me.StartPosition=FormStartPosition.CenterScreen StartPosition 属性还有

22、其他的取值,请读者自行查阅MSDN。Form类拥有很多属性,本节仅介绍了几个最常用的属性,请您通过 MSDN 了解其他属性。4Form 类的常用方法 Form类提供了许多方法,其中最常用的有以下几个:(1)关闭与隐藏窗体 Me.Close()关闭窗体 Me.Hide()隐藏窗体 36.N E T技术大系 编程的奥秘 技术内幕 关闭一个窗体是指不再使用这个窗体,.NET 虚拟机把这个窗体对象标记为不再使用,所占用的内存可以被回收。一个窗体被关闭之后,就不能再使用它了。隐藏一个窗体是指这个窗体暂时从屏幕上消失,在需要的时候可以通过将其 Visible 属性设置为 True 而重新显示在屏幕上。窗体

23、隐藏的特点是窗体对象仍然存在于内存中,当再次显示时,其中所有控件的属性值仍然保存隐藏之前的原始状态。创建一个窗体需要花费许多时间,而重新显示一个窗体则速度非常快。所以,为了加快程序的响应时间,可以预先创建一个窗体对象但不显示(VisibleFalse),需要时设置 VisibleTrue 显示它,这会给用户此程序运行速度很快的感觉。技术探索 使用 Timer控件进行计数,让窗体显示 1分钟,再隐藏 1分钟。(2)显示窗体 可以使用窗体对象的 Show()、ShowDialog()方法显示窗体,但这两者是有区别的,请做以下实验。从“项目”菜单中选择“添加 Windows 窗体”命令(参见图 2-

24、7)。图 2-7 新建一个窗体 单击【打开】按钮,将会在项目中添加一个新窗体 Form2,可以在项目管理器中看到这个新窗体。打开第一个窗体Form1,确定窗体上有一个按钮 Button1,双击 Button1切换到代码视图,给其 Click事件编码:Private Sub Button1_Click(ByVal sender As System.Object,_ ByVal e As System.EventArgs)Handles Button1.Click Dim frm As New Form2 frm.ShowDialog()End Sub 编译运行之后,单击按钮 Button1,Fo

25、rm2 窗体将会显示在屏幕上。注意,这时可以试着再单击Form1,您会发现 Form1 的标题栏始终是灰的,无法被激活。只有先关闭Form2,才能再次单击 Form1 上的 Button1。两个窗体之间如果存在这种关系,则称 Form2 按“模式”方式显示。37.N E T技术大系 第 2 章 .N E T 程序设计基础 现在把代码中的 frm.ShowDialog()改为 frm.Show(),再运行看看,现在,可以随意地用鼠标单击激活Form1 和 Form2 了。这种情况称 Form2 按“非模式”方式显示。何时用模式,何时用非模式,取决于程序的具体要求。一个实例是 Microsoft

26、Word 的“插入图片”窗体就必须是模式的,而“查找”窗体就必须是非模式的,读者可以打开 Word 试一试。读者可能会奇怪,在解决方案资源管理器中 Form1、Form2 看上去都是地位平等的,为什么程序运行时会自动显示Form1,而不会自动显示 Form2,要显示 Form2 居然还要编码?这涉及到“程序主窗体”的概念。使用 VB 的早期版本创建一个新项目时,默认情况下第一个创建的窗体称为主窗体,后创建的窗体是辅助窗体,关闭主窗体会导致程序的结束,关闭辅助窗体则不会结束整个程序。VB.NET 延续了这个概念。当程序运行时,会首先显示主窗体(当然可以通过给Sub Main()编码手动改变 VB

27、.NET 的默认行为),所以,主窗体往往又称为“启动窗体”,但这种称呼的含义是模糊的,定义并不严格。可以定义项目中的任何一个窗体为启动窗体,方法是在“解决方案资源管理器”中的项目节点上单击鼠标右键,选择“属性”(参见图 2-8)。图 2-8 设定启动对象 如图 2-8 所示,从“启动对象”下拉列表中选择一个窗体对象,则此窗体将会在程序运行时自动显示,关闭此窗体会导致程序关闭,而项目中的其他窗体对象必须先被创建(New)之后,再调用其Show()或 ShowDialog()方法显示。技术内幕 主窗体的真实含义 由于 VB.NET 在后面悄悄地进行了一些工作,所以主窗体的真实含义不好理解。C#就明

28、确得多了。打开 VS.NET,创建一个 C#的 Windows 应用程序,切换到代码视图,可以看到以下代码:/应用程序的主入口点/STAThread static void Main()38.N E T技术大系 编程的奥秘 Application.Run(new Form1();在 Application.Run()中指定的窗体就是主窗体。当主窗体关闭以后,Application.Run()函数执行完毕,Main()函数结束,整个程序也就终止了。5Form 类的事件 事件(Event)是面向对象编程中的一个很重要的概念。可以这样通俗地理解,事件用于表明在某个对象内部某些事情发生了,其他对象可以

29、决定是否对这些事情进行响应。举一个简单的例子,当鼠标在一个窗体上单击时,会激发窗体类的 Click 事件,如果程序员为这个 Click事件写了一些代码,那么,程序运行时只要鼠标单击了这个窗体,Click事件就会发生,程序员写的代码就会被运行。下面看两个实例。实例 1:跟踪鼠标的移动 新建一个“Windows 应用程序”项目,取名为“MouseLocation”,往窗体上拖入一个 Label控件,设置其 Text 属性为“(0,0)”,如图 2-9所示。双击图 2-9 所示主窗体内部,将会切换到代码视图,光标默认位于 Form_Load()过程中,如图 2-10 所示。图 2-9 主窗体 图 2

30、-10 给特定的事件编码 在代码视图左上角的组合框中选中“(Form1 Events)”,在右上角的组合框中选择“MouseMove”(如图 2-10所示),则 VS.NET 会自动生成处理MouseMove 事件的框架代码,并且光标会自动定位于 Sub Form1_MouseMove()过程内部:Private Sub Form1_MouseMove(ByVal sender As Object,ByVal e As _ System.Windows.Forms.MouseEventArgs)Handles MyBase.MouseMove End Sub 在 Sub Form1_Mouse

31、Move()过程内部输入以下代码:Label1.Text=(&CStr(e.X)&,&CStr(e.Y)&)现在编译并运行程序(参见图 2-11)。可以看到随着鼠标的移动,标签的数字也跟着变动,能及时地显示当前鼠标的位置坐标。理解这个示例的关键有两点。图 2-11 实例运行结果 39.N E T技术大系 第 2 章 .N E T 程序设计基础(1)当鼠标在窗体上移动时,MouseMove 事件会被激发,会调用我们给 MouseMove 事件写的代码:Label1.Text=(&CStr(e.X)&,&CStr(e.Y)&)MouseMove 事件激发多少次,这段代码就会执行多少次。(2)当 M

32、ouseMove 事件激发时,当前鼠标的位置坐标 X 和 Y 被封装到了 MouseMove 事件的参数 e 中,可以用 e.X 和 e.Y取出这个值。为了在标签上显示(0,0)这样格式的信息,需要把整数e.X 和 e.Y用 VB.NET 提供的内部函数 CStr()转为字符串变量,然后再连在一起,这就是我们所写的代码的作用。提示 有关函数的概念将在 2.2节介绍。技术内幕 窗体坐标和屏幕坐标 在计算机中使用直角坐标系来确定一个点(参见图 2-12)。与数学中使用的直角坐标系不同,计算机中使用的直角坐标系 Y 轴正向是向下的。窗体坐标是以窗体为依据的,窗体内部区域左上角为原点。而屏幕坐标是以显

33、示器所显示的区域为标准的,屏幕上左上角为原点,如图 2-13所示。图 2-12 计算机中使用的坐标系 图 2-13 窗体坐标与屏幕坐标 实例 MouseLocation 中输出的是窗体坐标值。第 10章 10.1.4节中对坐标系有更多的介绍。实例 2:在窗体上输出文字 在实例 MouseLocation 中是使用 Label 控件输出结果的,能不能不使用控件而直接在窗体上输出文字?完全可以。新建一个“Windows 应用程序”项目,往窗体上增加一个按钮,设置其 Name 属性为“btnOutputStr”,将 Text 属性改为“输出字串”,如图 2-14 所示。给按钮 btnOutputSt

34、r的 Click事件编码如下:Private Sub btnOutputStr_Click(ByVal sender As System.Object,_ ByVal e As System.EventArgs)Handles btnOutputStr.Click Dim g As Graphics 获取绘图对象 g=Me.CreateGraphics 以红色输出字串 g.DrawString(您好!世界!,New Font(宋体,16),Brushes.Red,10,1 0)释放绘图对象(100,50)100 X O Y 50 40.N E T技术大系 编程的奥秘 g.Dispose()En

35、d Sub 运行结果如图 2-15 所示。图 2-14 设计好的程序界面 图 2-15 在窗体上输出文字 简要解释一下所写的代码:要在窗体上输出,必须获取代表窗体可输出区域的 Graphics 对象。可以把这个对象看成是一块画布,有了画布,就可以用红色画刷(Brushes.Red),以 16点大小的宋体字,在窗体坐标(10,10)处输出字符串“您好!世界!”。使用完绘图对象g 之后,使用 Dispose()方法回收对象占用的资源。程序运行时,单击按钮可以正确地输出字符串。但现在试一试,把窗体最小化,再还原,发生了什么?原来看得见的“您好!世界!”不见了,为什么会这样呢?原来 Windows 中

36、所有的程序窗体都是“画出来的”,当一个窗体最小化时,Windows 负责把此窗体挡住的其他窗体重绘出来;当窗体还原时,Windows 就负责在原来的位置重新把此窗体画出来。为了正确地完成这个重绘过程,Windows 必须知道它需要重绘窗体上的哪些东西。Windows 知道应该重绘窗体和窗体上的控件,但在运行中使用绘图方法输出的内容(如上面的代码所示)就不会自动重绘了,这就是字符串“神秘失踪”的原理。怎么解决这个问题呢?Windows 在每次重绘窗体的过程中,窗体对象都会引发一个 Paint 事件,因此可以在此事件中再次调用绘图代码。将原来的代码移入到Form_Paint()事件中,如下所示。P

37、rivate Sub Form1_Paint(ByVal sender As Object,_ ByVal e As System.Windows.Forms.PaintEventArgs)Handles MyBase.Paint Dim g As Graphics 获取绘图对象 g=e.Graphics 以红色输出结果 g.DrawString(您好!世界!,New Font(宋体,16),Brushes.Red,10,10)释放绘图对象 g.Dispose()End Sub 编译运行之后,发现窗体先最小化再还原之后,文字会正确地显示。结合前面所讲的内容,您一定会明白其中的道理。提示 10.

38、1.2节中详细介绍了图形重绘原理。现在运行修改过的程序,细心的读者会发现程序一运行就有文字输出,不再需要单击按钮了,这是因为窗体第一次显示在屏幕上时,Paint 事件也会发生。所以,现在可以从代码中删除 Sub btnOutputStr_Click()过程,然后到窗体视图中把按钮删除。您 41.N E T技术大系 第 2 章 .N E T 程序设计基础 提示 仅删除按钮本身并不会同步删除其事件响应代码,这部分代码需要手动删除。新代码的另一个改变是获取 Graphics 绘图对象的语句变了,它可以直接从参数e 中获取。这是因为 Paint 事件主要用于绘图,所以,为了方便,其参数 e 中就直接包

39、含了绘图对象g,不再需要调用窗体对象的 CreateGraphics()方法。技术探索 绘图对象 Graphics 拥有相当丰富的功能,请查阅 MSDN,试着在窗体上输出一幅图片。除了已介绍的 MouseMove 事件和 Paint 事件,常用的 Form类的事件还有以下几个。(1)Load事件:当窗体第一次创建时发生。(2)Click/DoubleClick 事件:鼠标在窗体上单击/双击时发生。(3)KeyPress/KeyDown/KeyUp事件:从键盘输入时发生,通过事件提供的参数,可以知道用户按下了键盘的哪个键,其中 KeyDown 和 KeyUp 事件可以判断组合键(如 Ctrl+C

40、)。(4)MouseDown/MouseUp事件:按下鼠标键时发生,可以知道按下的是左键还是右键,以及按下时是否同时还按了键盘的组合键(如 Ctrl、Alt、Shift)。(5)Closing 与 Closed 事件:当窗体关闭时发生。特别是 Closing 事件,可以通过设置其参数 e.Cancel=True 来禁止用户单击窗体右上角的关闭按钮来关闭窗体。技术探索 在 MSDN中查看 Form类的各种事件,了解其含义和用途。2.1.2 常见控件使用 上一节介绍了窗体Form 类的常用属性、事件和方法。一个空白的Form并没有多大用,Form最常见的是作为一个“容器”,在其中可以加上各种各样的

41、控件,从而构成一个可视化的程序用户界面。本节将介绍三个常见界面控件:菜单、状态条和工具栏的使用方法。在本书中不会对所有的控件做详细介绍,而希望能通过若干典型的控件介绍一些重要的基础知识。掌握了这些知识,读者就可以通过其他资料来自行学会使用更多的控件了。1设计菜单(Menu)菜单可谓是Windows 应用程序中最重要的界面元素之一。有两种主要的菜单形式:(1)标准的下拉式菜单,这种菜单一般位于窗口的最上方,分为若干个菜单组,每个组下又有多个菜单项,有的菜单项还有子菜单项。(2)弹出式菜单,这种菜单一般通过单击鼠标右键弹出。在 VS.NET 中,MainMenu 组件用于创建下拉式菜单,Conte

42、xtMenu 组件用于创建弹出式菜单,如图 2-16所示。在 VS.NET 中设计菜单非常简单。以下拉式菜单为例,把一个 MainMenu 组件从工具箱中拖到窗体上,窗体上部就会出现一个菜单的雏形,并有一个选中的灰色方框可直接输入菜单文本,如图 2-17 所示。每输入完一项,可以按回车键确定。图 2-16 两种菜单组件的图标 下拉式菜单 弹出式菜单 42.N E T技术大系 编程的奥秘 图 2-17 菜单设计器 当需要修改某一项菜单时,直接用鼠标单击选中,然后在屏幕右下方的属性窗口设置菜单项的各种属性。VS.NET 提供的菜单设计器非常易于使用,以下是一些使用技巧。(1)菜单分隔线:可以直接在

43、输入区中输入减号“”生成,亦可以在菜单项属性窗口中设置 Text 属性为减号“”。(2)可以直接用鼠标拖动菜单项以调整相对位置。(3)选中菜单项单击鼠标右键,会弹出一个快捷菜单,其中提供了一些常用的命令(参见图2-18)。“剪切”一个菜单,然后在需要插入的位置选择“粘贴”命令,可以快速地在多个菜单组之间移动子菜单项。(3)菜单项有许多常用属性,可以在菜单项属性窗口中进行设置(参见图 2-19)。图 2-18 菜单设计器的弹出式菜单 图 2-19 菜单项属性窗口 这里简单介绍一下常用属性的用法(表 2-1)。表 2-1 菜单项常用属性 实现功能 说 明 设置属性 禁用菜单项 让选定的菜单项不可用

44、(即灰掉)Enabled=True 复选菜单项 选中后在菜单项前会加一个小对钩,可以同时有多个菜单项打上此标记 Checked=True 单选菜单项 选中后会在菜单项前加一个小圆点,一个菜单组中一次只能有一个菜单项被选中 RadioCheck=True 隐藏菜单项 让一个菜单项不显示(仍是存在的,只不过程序运行时在菜单中看不到此项)Visible=False 43.N E T技术大系 第 2 章 .N E T 程序设计基础(4)弹出式菜单:使用 ContextMenu 组件设计,其设计方法与MainMenu 基本是一样的,但其特点是运行时并不会自动显示此菜单,需要右击特定的控件才能出现。在 V

45、S.NET 提供的许多控件中,都有一个 ContextMenu 属性,只需在这些控件的属性窗口中设计其 ContextMenu 属性为指定的 ContextMenu 组件名字即可将控件与弹出式菜单相关联。试一试(1)新建一个“Windows 应用程序”项目,然后,试着建立本章实例 MyEditor的菜单(参见图 2-20)。图 2-20 “我的文本编辑器”菜单(2)随意设计一个弹出式菜单,设置右击窗体弹出此菜单。给菜单项编码也非常简单,只需在菜单设计器中双击某个菜单项,即可切换到代码视图。VS.NET 会自动生成菜单项 Click事件的框架代码,如下所示:Private Sub mnuOpen

46、_Click(ByVal sender As System.Object,_ ByVale As System.EventArgs)Handles mnuOpen.Click 在此输入代码 End Sub 提示 在 VS.NET 中,双击某个指定的控件会自动生成其默认事件的框架代码,然后就可以从代码编辑器右上方的下拉框中选取特定的事件,这是一个最基本、最常用的使用技巧,请注意掌握,以后本书不再重复介绍为某个事件编码的基本步骤。技术探索(1)读者可能会感到好奇,VS.NET 是如何生成这些菜单的?请随意设计一个菜单,然后切换到代码视图,展开折叠的标有“Windows 窗体设计器生成的代码”这部分

47、代码,找到“Private Sub InitializeComponent()”这一过程,其中的代码解释了菜单生成的全部奥秘。要完全看懂这些代码,您需要至少学完本书前 4章的内容。(2)您一定见过许多漂亮的菜单,并可能想在 VS.NET 提供的 MainMenu 组件中给菜单加上小图标,然而很遗憾,VS.NET 默认提供的 MainMenu 组件并没有此功能,请您利用 Google(http:/)到因特网上去找到解决此问题的方法。在许多专业技术论坛中也有对此问题的解答。44.N E T技术大系 编程的奥秘 2使用状态条(StatusBar)状态条大家并不陌生,图 2-21 是 Word 200

48、3 中的状态条。图 2-21 Word 2003 提供的状态条 可以看到状态条主要用于显示各种信息,信息被划分为几个区域。每个区域被称为状态条的面板(Panel)。(1)状态条示例介绍 在 VS.NET 中,提供了一个 StatusBar控件用于在程序中显示一个状态条。请看图 2-22 所示的状态条使用实例的运行效果(示例项目 UserStatusBar)。图 2-22 所示为最简单的状态条,在窗体下部仅有一个简单的文本,此时状态条处于简单文本状态(SimpleText)。单击【切换状态条显示状态】按钮,可以看到如图 2-23所示的窗体。图 2-22 仅有文本的状态条 图 2-23 显示面板的

49、状态条 图 2-23 所示为显示了多个面板的状态条。第一个面板仅显示了一些文本,第二个面板加了一个图标,第三个面板将显示一个进度条,第四个面板是一个时钟,显示了当前的时间。先单击【将进度条放到状态栏中】,再单击【让进度条开始走/停】按钮,可以看到进度条在状态条上不停地“走”,如图 2-24所示。图 2-24 不停地“走”的进度条 这个小例子虽然简单,却是本书所介绍的第一个复杂一些的程序。通过对这个例子的分析,相信读者一定能大大增加对 VS.NET 编程的兴趣。(2)状态栏示例分析 现在来揭开这个示例程序的面纱,看看怎么实现上面介绍过的实例功能。访问状态条对象与面板对象 首先要明白,状态条(St

50、atusBar)中可以放置多个面板,每个面板都是一个 StatusBarPanel对象,多个 StatusBarPanel对象构成一个集合,作为状态条对象的Panels 属性而存在。当需要访问一个面板对象时,要通过其所属的集合对象访问。假设状态条对象 StatusBar1 中有三个面板,则以下代码设置第 2个面板的文本为“这是第 2 个面板”:StatusBar1.Panels(1).Text=这是第 2 个面板 注意.NET 中集合的索引都是从 0开始的,所以,Panels(0)代表第一个面板,而 Panels(2)是第三个面板。45.N E T技术大系 第 2 章 .N E T 程序设计基

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁