Windows程序设计.doc_第1页
Windows程序设计.doc_第2页
Windows程序设计.doc_第3页
Windows程序设计.doc_第4页
Windows程序设计.doc_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第18章 窗体编程Windows窗体(Form,形状/表单)原来是Visual Basic程序的用户界面,后来成为.NET程序的GUI,被Visual Studio中的C#、Visual Basic、F#、MC+和C+/CLI等开发语言工具所使用,后来又从Visual C+ 2005起被引入到MFC编程中。作为应用程序的基本单元,窗体实质上只是一个(类似于对话框的)简单框架窗口,内含一块空白板(客户区)。开发人员可通过添加控件(包括菜单条、工具条、状态条、计时器和公用对话框等)来创建用户界面,并通过编写代码来操作数据,从而填充这个空白板。为此,Visual Studio提供了一个有助于编写代码的集成开发环境,以及一个针对.NET框架编程的丰富的控件集。通过使用代码来补充这些控件的功能,可以方便快捷地开发所需要的解决方案。由于时间有限,本章只介绍C# 窗体编程一些基本内容。相关帮助在MSDN帮助网站的技术资源库中的位置:l 窗体编程:“MSDN Library.NET开发.NET Framework 4.5.NET Framework 开发指南开发客户端应用程序Windows 窗体”。l .NET类库:“MSDN Library.NET 开发.NET Framework 4.5.NET Framework 类库”中的System、System.Windows.Forms和System.Drawing等命名空间。图18-1是在窗体编程需要用到的一些.NET类型的继承关系图,涉及的命名空间主要有System.Windows.Forms、System.Drawing和System.Drawing.Drawing2D。18.1 创建窗体下面我们以一个简单的窗体交互绘图程序FormDraw为例(参见图18-2),介绍用C# 编写简单窗体程序的全过程。18.1.1 创建窗体项目打开“新建项目”对话框(参见图18-3),选左边“已安装的模板”栏的“其他语言Visual C#”项,再选中间栏的“Windows窗体应用程序”模板。选择父目录位置后,输入项目名称“FormDraw”,去选“为解决方案创建目录”复选框,按“确定”钮关闭对话框。FormContainerControlScrollableControlControlComponentMarshalByRefObjectObject用户窗体类ToolStripPanelMenuStripToolStripItemToolStripButtonToolStripDropDownItemToolStripMenuItemGraphicsImagePenBrushSolidBrushTextureBrushValueTypeColorPointFFontRectangleFSizeFHatchBrushBitmapColorDialogCommonDialogFontDialogPrintDialogFileDialogPageSetupDialogFolderBrowserDialogConsoleStringDelegateEventStructPathGradientBrushLinearGradientBrushButtonBaseCheckBoxButtonMathStatusStripRadioButtonComboBoxListControlGroupBoxLabelListBoxPictureBoxTextBoxBaseTimerTextBoxApplicationOpenFileDialogSaveFileDialogMessageBox图18-1 窗体编程中常用.NET类型的层次结构字体和颜色标明类型所在的命名空间,正常:System、粗体:System.Windows.Forms、斜体:System.Drawing、粗斜体:System.Drawing.Drawing2D、灰色:System.ComponentModel图18-2 交互式窗体绘图程序图18-3 新建项目对话框1项目目录和文件Visual Studio会自动创建名为FormDraw的项目目录,在项目目录中,自动创建的文件有:项目文件:FormDraw.sln(解决方案)、FormDraw.csproj(C# 项目)、App.config(XML配置文件)和FormDraw.v11.suo(解决方案的用户选项文件),代码文件:Program.cs(程序入口)、Form1.cs(窗体编程)和Form1.Designer.cs(窗体设计)。项目目录还自动包含存放项目的目标代码的obj目录和可执行程序的bin目录,这两个目录中都可包含Debug和/或Realse目录,分别存放具体的调试版和/或发行版的二进制程序代码。项目目录还自动包含了一个存放项目属性的Proporties目录,包含如下文件:Settings.settings(项目设置,XML文件)、Resources.resx(资源)、AssemblyInfo.cs(程序集代码)和Resources.Designer.cs(资源设计代码)。2用户界面与工具箱IDE会自动打开一个默认的名为“Form1”的空白窗体(Form1.cs设计),并打开对应的“工具箱”或/和属性窗口,供程序员进行窗体设计,参见图18-4。图18-4 C# 窗体编程界面窗体设计所用的工具箱(参见图18-5)内容丰富,除了VB动力包(Visual Basic PowerPacks)栏(5种)、“报表”栏(1种)和“WPF互操作性”栏(1种)的工具外,其余所有可用的工具位于“所有Windows窗体”栏中(只是缺少了“数据”栏中VS2010新增加的“图表”工具Chart),共有66种。其下各栏将这些工具分门别类地列出,包括:“公共控件”(21种)、“容器”(6种)、“菜单和工具栏”(5种)、“数据”(5种,其中的图表工具Chart不在“所有Windows窗体”栏中)、“组件”(14种)、“打印”(5种)和“对话框”(5种),共计60种,参见图18-5。只有DomainUpDown(域上下)、PropertyGrid(属性网格)、Splitter(拆分条)、HScrollBar(水平滚动条)、VScrollBar(垂直滚动条)和TrackBar(跟踪条)这6种工具没有包含在这些分类栏中。另外,在窗体编程中,工具箱的“常规”栏为空。 a) 公共控件、容器 b) 报表、菜单和工具栏、数据、组件 c) 打印、对话框、WPF互操作性、VB动力包 图18-5 窗体工具箱3代码文件内容自动生成的程序代码,定义了一个与项目同名的命名空间,还定义了用户的应用程序类Program(基类为默认的System.Object)和派生的窗体类Form1(基类为System.Windows. Forms.Form,参见图18-6),后者被定义在两个同名的部分类(分别位于Form1.cs和Form1.Designer.cs者两个代码文件)中。1)Program.cs自动生成的Program.cs代码为:图18-6 Form1及其各级基类FormContainerControlScrollableControlControlComponentMarshalByRefObjectForm1Objectusing System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace FormDraw static class Program / / 应用程序的主入口点。 / STAThread static void Main() Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1(); 该文件中的代码主要是定义了Program类,它包含Main入口主程序。Main方法中最重要的语句为:Application.Run(new Form1();它创建窗体Form1对象,并以其为程序界面(主框架窗口)来运行窗体应用程序。2)Form1.cs代码文件Form1.cs包含了窗体部分类Form1的一部分定义,用于程序员编写事件处理代码,也是我们今后工作的主要对象。可以在“解决方案资源管理器”页中,选中“Form1.cs”项后,按鼠标右键,在弹出的浮动菜单中选“查看代码(C)”菜单项,来以源代码方式打开该文件。下面是该文件的初始代码:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace FormDraw public partial class Form1 : Form public Form1() InitializeComponent(); 3)Form1.Designer.cs在代码文件Form1.Designer.cs中包含了窗体部分类Form1的另一部分定义,用于存放系统自动生成的窗体设计代码。下面是该文件的初始代码(可以展开Form1.cs项,双击其Form1.Designer.cs子项来显示该文件中的代码内容):namespace FormDraw partial class Form1 / / 必需的设计器变量。 / private System.ComponentModel.IContainer components = null; / / 清理所有正在使用的资源。 / / 如果应释放托管资源,为 true;否则为 false。 protected override void Dispose(bool disposing) if (disposing & (components != null) components.Dispose(); base.Dispose(disposing); #region Windows 窗体设计器生成的代码 / / 设计器支持所需的方法 - 不要 / 使用代码编辑器修改此方法的内容。 / private void InitializeComponent() ponents = new System.ComponentModel.Container(); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Text = Form1; #endregion 4Application类密封类Application也位于System.Windows.Forms.Form命名空间中,直接派生于System.Object。它的定义为:public sealed class ApplicationApplication类具有若干用于启动和停止应用程序和线程、启用可视界面、以及处理Windows消息的方法,如下所示: l Run 在当前线程上启动应用程序消息循环,并可以选择使某窗体可见。常用的重载版为:public static void Run (Form mainForm)。l Exit 或 ExitThread 停止消息循环。常用的重载版为:public static void Exit ()。l EnableVisualStyles 此方法为应用程序启用可视样式。如果控件和操作系统支持视觉样式,则控件将以视觉样式进行绘制。若要使EnableVisualStyles生效,必须在应用程序中创建任何控件之前调用它;EnableVisualStyles 通常是Main函数的第一行。当调用EnableVisualStyles时,无需单独的清单即可启用可视化样式。语法为:public static void EnableVisualStyles ()。l SetCompatibleTextRenderingDefault 该方法用于设置兼容文本的默认表示方式。语法为:public static void SetCompatibleTextRenderingDefault (bool defaultValue)l DoEvents 在您的程序处于某个循环中时处理消息。 l AddMessageFilter 向应用程序消息泵添加消息筛选器来监视 Windows 消息。 l IMessageFilter 使您可以阻止引发某事件或在调用某事件处理程序前执行特殊操作。该类还具有用于获取或设置当前线程的区域性信息的CurrentCultur和CurrentInputLanguage 属性。不能从此类派生新类(密封类)。18.1.2 修改窗体属性窗体的属性有很多(参见图18-7),其中常用的有:l 布局:大小Size默认为300*300像素,可以通过修改此属性,或直接拖动窗体的边框来改变窗体的尺寸。运行时用户也可以自己改变窗体大小。l 窗口样式:图标Icon默认为,可以通过为点击该属性条目右端浏览钮,装入新的图标文件(16*16和32*32像素,*.ico)。也可以自己通过为项目添加新建图标项,来创建新图标资源(在VS2012中,8位为全黑色,32位为PNG格式不能用IDE编辑),如FormDraw.ico (默认位于项目所在目录)。可以通过“项目添加新项”菜单项(或按对应的快捷键Ctrl+Shift+A)来完成,参见图18-8和9。然后,在窗体设计界面所对应的属性窗口中,将“窗口样式”栏的图标项“Icon”右边的图案,通过其右端的浏览钮来更换。 图18-7 窗体属性图18-8 添加新项对话框 a) 默认的新图标b) 自己设计的图标图18-9 添加新的图标项l 设计:名称(Name)相当于MFC中的ID,对应于窗体的类名。默认为Form1(似VB),可以改成自己喜欢的名称,如DrawForm,回车确认后,系统会自动修改所有相关文件内容中的该标识符。图18-10 设置窗体的背景色l 外观:背景色BackColor默认为系统的控件色Control(一般为黄灰色,与对话框的背景色相同),可以点击该属性右端的下三角按钮,选择自己喜欢的颜色,如“自定义”页上的白色。参见图18-10。l 外观:背景图片BackgroundImage默认无,可以自己为窗体添加背景图。并通过BackgroundImageLayout属性,来设置图片的填充方式(默认为Tile平铺,还可以选择中心Center、伸展Stretch和缩放Zoom)。l 外观:光标Cursor默认为Default(箭头Arrow)。可以选十字Cross,参见图18-11。l 外观:文本Text对应于窗体的标题,默认也为Form1,可以改为自己喜欢的标题,如“窗体绘图”。结果窗体如图18-12所示。 图18-11 可选光标图18-12 窗体外观18.1.3 添加菜单条与菜单项1添加菜单条与MFC会为应用程序的编程自动生成和添加菜单条、工具条和状态条不同,Visual C# 为窗体程序自动生成的只是一个简单的空白框架窗口,菜单条、工具条和状态条等都需要我们自己手工来添加。选中“Form1.cs设计”页,打开“工具箱”窗口,展开“菜单和工具栏”项,里面有菜单条(MenuStrip)、工具条(ToolStrip)和状态条(StatusStrip)等控件,参见图18-5 b)。它们都是C# 2.0新增加的控件类,分别用来替换老版本中的MainMenu、ToolBar和StatusBar等控件类,参见图18-13。为了兼容性,2.0版中仍然保留了这些老版本中的类,但是建议在编程中使用新的控件类。选中“工具箱”窗口的“菜单和工具栏”中的“MenuStrip”项,拖放到窗体中,系统则会自动为窗体添加一个停靠在标题条下的菜单条,参见图18-14 a)。并在Form1.Designer.cs 文件的部分窗体类定义的“Windows 窗体设计器生成的代码”区域后自动添加如下一行代码,来定义该菜单条所对应的菜单条类的实例对象menuStrip1:private System.Windows.Forms.MenuStrip menuStrip1;可以通过菜单条“属性”窗口中“设计”栏中的名称属性“(Name)”来修改该对象的变量名称,如mainMenuStrip(参见图18-14 b)),回车确认后,系统会自动修改项目中的所有相关部分的代码。ScrollableControlControlComponentMarshalByRefObjectObjectToolStripMenuStripStatusStripStatusBarToolBarMainMenuMenu图18-13 新老菜单条、工具条和状态条的控件类及其基类 a) 添加菜单条b) 修改菜单条对象的名称 c) 添加菜单项和访问键 d) 添加分隔条、文本框和组合框图18-14 添加菜单条及成员2添加菜单项可以像在MFC中一样,为菜单条添加菜单项和访问键&X,参见图18-14 c)。但是添加快捷键(shortcut key)、设置选中(checked)状态、添加图片、添加提示串等,.NET/C# 都比MFC方便,可以直接利用属性窗口,直观交互式地完成。 在菜单条中 ,除了添加菜单项外,你还可以利用下拉式列表来为菜单条添加分隔符(ToolStripSeparator类的对象,参见图18-18)、文本框和组合框,参见图18-14 d)。图18-15 设置快捷键可以通过在属性窗口底部的“杂项”栏中的“ShortcutKeys”项来设置快捷键(参见图18-15),按回车键完成。注意,设置快捷键后,系统会自动地将它作为默认串显示在菜单项的右端,不需要(也不支持)自己在菜单项自己编写诸如“tCtrl+N”的显式串。但是可以在属性窗口的“外观”栏的“ShortcutKeyDisplayString”属性中,输入自己的显示串,来代替默认的串。只有在该属性值为空时,系统才会显示默认的快捷键串。在C# 的窗体编程中,为菜单项添加小图片是非常容易的。只需在属性窗口的“外观”栏的“Image”属性中,单击右端的浏览钮,在弹出的对话框中,按“导入”钮,在弹出的“打开”对话框中,选择要装入图片资源即可,参见图18-16。与图标一样,你也可以自己创建位图资源(12*11像素,*.bmp)后再选入,参见图18-17。一般还需要为图片设置透明色,这可以通过属性窗口的“外观”栏中的“ImageTransparentColor”属性来进行,方法与前面设置窗体背景色类似。图18-16 选择菜单项图片图18-17 添加位图资源新项对话框你也可以选中菜单项后,直接按鼠标右键,在弹出的浮动菜单中,选“设置图像(M).”菜单项,来设置该菜单项的图片。注意,MFC会为应用程序自动生成包含“新建”、“打开”等常用按钮的工具条位图文件Toolbar.bmp。但是在Visual C# 的窗体编程中,得我们自己来创建和添加这些位图。不过,你也可以从我的个人网页上下载(BMP格式的6个小图标文件)。ComponentMarshalByRefObjectObjectToolStripItemToolStripButtonToolStripDropDownItemToolStripMenuItemToolStripSeparatorToolStripLabelToolStripStatusLabel图18-18 菜单项、按钮、状态标签和分隔符类及其基类你还可以利用“属性”窗口的“行为”栏中的“ToolTipText”属性,为菜单项添加鼠标滑过时的文本提示串。每当你为窗体添加一个菜单项,系统就会自动添加一个对应的菜单项对象(似添加菜单条),如打开菜单项的对象定义为:private System.Windows.Forms.ToolStripMenuItem 打开OToolStripMenuItem;它们都是ToolStripMenuItem类(参见图18-18)的实例对象,默认的对象名为:菜单项名+访问键字母+ToolStripMenuItem,如上面的“打开OToolStripMenuItem”。你也可以在属性窗口“设计”栏的“(Name)”项中,修改此对象名,如改为open。3添加菜单响应选中菜单项,选择“属性”窗口的事件页,在“操作”栏的“Click”属性中,键入响应方法的名称,如OnFileOpen。回车确认后,系统会自动在Form1.cs文件中的窗体部分类定义中,添加带空方法体的事件处理方法。例如: private void OnFileOpen (object sender, EventArgs e) 可以添加自己的处理代码,如打开文件公用对话框,获取用户选择的(带路径的)文件名。这需要先将工具箱窗口的“对话框”栏中的“OpenFileDialog”控件,拖放到窗体。系统会自动为窗体类添加对应的实例对象,默认的名称为openFileDialog1:private System.Windows.Forms.OpenFileDialog openFileDialog1;可以属性窗口顶部的下拉式列表中,选择openFileDialog1项,在属性页中修改“设计”栏的“(Name)”属性的值,达到修改该对象名的目的,如改成openFileDlg(参见图18-19)。则可以在Form1.cs文件中编写打开公用文件对话框的代码如下: private void OnFileOpen(object sender, EventArgs e) if (openFileDlg.ShowDialog() = DialogResult.OK) string fn = openFileDlg.FileName; MessageBox.Show(fn,打开的文件路径); 类似地,你也可以为“新建”菜单项,添加OnFileNew事件处理方法,并在其中使用MessageBox类的Show静态方法来显示一个弹出式消息对话框。例如:图18-19 添加打开文件对话框对象 private void OnFileNew(object sender, EventArgs e) MessageBox.Show(创建新文档!); 4MessageBox类消息框类MessageBox是System.Object类的直接派生类,位于System.Windows.Forms命名空间中。其Show静态方法的常用重载格式有:public static DialogResult Show (string text) / 无标题public static DialogResult Show (string text,string caption) / 含“确定”按钮public static DialogResult Show (string text, string caption, MessageBoxButtons buttons)其中,MessageBoxButtons枚举类型,也位于System.Windows.Forms命名空间中,包含表18-1列出的诸枚举成员。例如(参见图18-20):MessageBox.Show(创建新文档!);表18-1 枚举类型MessageBoxButtons的成员成员名称说明AbortRetryIgnore消息框包含“中止”、“重试”和“忽略”按钮。OK消息框包含“确定”按钮。OKCancel消息框包含“确定”和“取消”按钮。RetryCancel消息框包含“重试”和“取消”按钮。YesNo消息框包含“是”和“否”按钮。YesNoCancel消息框包含“是”、“否”和“取消”按钮。MessageBox.Show(创建新文档!, 提示信息);MessageBox.Show(创建新文档?, 请选择, MessageBoxButtons.YesNo); 图18-20 MessageBox的不同Show重载方法的输出5添加退出菜单项默认的窗体,是利用关闭窗口来退出应用程序。我们也可以为窗体的“文件”菜单,添加“退出”或“关闭”菜单项,利用应用程序类的Exit静态方法,来退出正在运行的应用程序。具体做法是:l 在现有的文件菜单项后,添加一个分隔符,参见图18-21 a)。l 添加退出菜单项(参见图18-21 b)):n 设置其菜单名或其“外观”栏的“Text”属性的值为“退出(&X)”。 a) 添加分隔符b) 添加退出菜单项图18-21 添加分隔符和退出菜单项n 设置其“杂项”栏“ShortcutKeys”属性的值为Alt+F4。n 设置其“设计”栏“(Name)”属性的值为exit。l 添加鼠标单击事件处理方法:n 在“属性”的“事件”页 “操作”栏的“Click”项中,输入事件处理的方法名OnExit。n 在自动生成的空方法体中,添加语句:Application.Exit();方法的代码为: private void OnExit(object sender, EventArgs e) Application.Exit(); 18.1.4 添加工具条与按钮为窗体添加工具条及其按钮的方法与添加菜单条和菜单项的类似。1添加工具条选中“Form1.cs设计”页,打开“工具箱”窗口,展开“菜单和工具栏”项,将“ToolStrip”项,拖放到窗体中,系统则会自动为窗体添加一个停靠在在菜单条下的工具条,参见图18-22 a)。并在Form1.Designer.cs 文件中自动添加定义该工具条所对应的工具条类的实例对象toolStrip1:a) 添加工具条b) 添加按钮图18-22 添加工具条与按钮private System.Windows.Forms.ToolStrip toolStrip1;它是ToolStrip类(参见图18-13)的实例对象。也可以通过工具条的“属性”窗口中“设计”栏中的名称属性“(Name)”来修改该对象的变量名称,如toolStrip。回车确认后,系统也会自动修改项目中的所有相关部分的代码。2添加按钮利用工具条的添加新项的下拉式列表,可以为工具条添加多种成员(参见图18-22 b)),常用的是按钮与分隔符(ToolStripSeparator类的对象,参见图18-17)。新添加按钮时,系统也会在Form1.Designer.cs 文件中自动添加一个对应的按钮对象:private System.Windows.Forms.ToolStripButton toolStripButton1;它们都是ToolStripButton类(参见图18-18)的实例对象,默认的对象名为:toolStripButtoni。你也可以修改此对象名,如改为openButton。默认的按钮图片为System.Drawing.Bitmap,可以通过“属性”窗口“外观”栏中的“Image”属性,或直接在按钮上按鼠标右键,在弹出的浮动菜单中选“设置图像(M).”菜单项,来修改(装入或创建)按钮图片,具体方法与为菜单项添加图片类似。最好采用与对应菜单项相同的图片,参见图18-23。图18-23 为工具条按钮添加图片你还可以利用“属性”窗口“外观”栏中的“Text”属性或“行为”栏中的“ToolTipText”属性,为按钮添加鼠标滑过时的文本提示串(默认为“toolStripButton i”),如“打开文件”。3添加按钮响应为工具条上的按钮添加消息响应的方法与为菜单条添加菜单项响应的方法类似:选中按钮,选择“属性”窗口的事件页,在“操作”栏的“Click”属性中,利用该属性项右端的下拉式列表,选择对应菜单项的响应方法名,如OnFileOpen(参见图18-24),一般不需要键入和创建新的消息响应方法。图18-24 为工具条按钮选择响应方法4动态修改按钮颜色一个设置颜色的按钮,可以让它随着用户选择的颜色而改变。我们的做法是去掉按钮的图片,动态修改其背景色属性。具体步骤为:l 在工具条中添加按钮,修改其“(Name)”属性(对象名)为“setColButton”。l 将其“Image”属性改为“(无)”,参见图18-25。图18-25 将颜色设置按钮的图片属性设置为无l 在窗体类DrawForm的定义中添加字段(类变量):Color col = Color.Green;l 在窗体类DrawForm的构造函数中,设置其背景色属性为初始颜色。如: Color col = Color.Green; public DrawForm() InitializeComponent(); setColButton.BackColor = col; l 将工具箱对话框栏的“ColorDialog”控件添加到“窗体绘图”窗口中,并修改其对象的(Name)属性值为“setColDlg”。l 为新加的空白按钮添加Click响应OnSetCol。在该响应方法中,打开颜色公用对话框。并在用户选择新的颜色后,设置其背景色属性为当前颜色。如: private void OnSetCol(object sender, EventArgs e) setColDlg.Color = col; if (setColDlg.ShowDialog() = DialogResult.OK) col = setColDlg.Color; setColButton.BackColor = col; 18.1.5 添加状态条和状态标签可以为窗体添加状态条,然后再为状态条添加状态标签等成员,用于显示提示信息和各种状态数据,如当前鼠标位置等。1添加状态条选中“Form1.cs设计”页,打开“工具箱”窗口,展开“菜单和工具栏”项,将状态条项“StatusStrip”,拖放到窗体中,系统则会自动为窗体添加一个停靠在在窗口底部的状态条,参见图18-26。并在Form1.Designer.cs 文件中自动添加定义该状态条所对应的状态条类的实例对象statusStrip1:private System.Windows.Forms.StatusStrip statusStrip1;它是StatusStrip类(参见图18-13)的实例对象。也可以通过工具条的“属性”窗口中“设计”栏中的名称属性“(Name)”来修改该对象的变量名称,如statusStrip。 图18-26 添加状态条 图18-27 状态条成员(左)与拆分按钮成员(右)2添加状态标签可以添加到状态条中的成员(参见图18-27 左)有状态标签(StatusLabel)、进度条(ProgressBar)、下拉式按钮(DropDownButton)和拆分按钮(SplitButton),其中的拆分按钮又含有若干成员,参见图18-27 右。常用的是状态标签,它可以用于显示提示信息和各种状态数据,如当前鼠标位置等。为状态条添加状态标签时,系统会在Form1.Designer.cs 文件中自动添加一个对应的状态标签对象:private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1;它是ToolStripStatusLabel类(参见图18-18)的实例对象。可以为状态标签设置各种相关的属性,还可以在程序的运行过程中,动态修改这些属性的属性值。3显示提示信息为了显示菜单项和工具条按钮等的提示信息,可以在状态条上添加一个状态标签。在对应的“属性”窗口中,进行如下修改:l 修改其“设计”栏“(Name)”属性(对象名)为promptLabel(默认为toolStripStatusLabel1)。l 修改其“外观”栏的“BackColor”属性值为“系统”列表中的“Control”(默认与窗体背景色相同,如为“Web”中的“White”)。l 修改其“外观”栏的“Text”属性值为“就绪”(默认为“toolStripStatusLabel1”)。l 修改其“外观”栏的“TextAlign”属性值(参见图18-28)为“MiddleLeft”(默认为“MiddleCenter”)。图18-28 设置文本对齐属性值修改其“外观”栏的“Spring”(弹性)属性值为“true”(默认为false)。最后一个属性为true时,该标签会自动伸缩,始终充满状态条的剩余空间。修改前的样子和修改后的结果参见图18-29。图18-29 添加显示提示信息用的状态标签与MFC不同,C# 窗体中的状态条并不能自动显示菜单项和工具条按钮的提示信息,而必须自己写代码来完成该任务。例如,可以为打开菜单项和对应的工具条按钮添加同一个“MouseHover(鼠标悬停)” 事件(即鼠标在对应菜单项或按钮上停留一段时间后所触发的事件)的事件处理方法OnFileOpenMouseHover,参见图18-30。并为该方法添加设置提示标签文本属性值的语句: private void OnFileOpenMouseHover(object sender, EventArgs e) promptLabel.Text = 打开现有文档; 图18-30 添加鼠标悬停事件的处理方法当然,你也可以通过为菜单项或按钮添加鼠标进入(MouseEnter)或鼠标单击(Click)等事件的处理方法,来显示提示信息。为了在鼠标离开菜单项或按钮后,还原“就绪”信息,可以再添加对鼠标离开(MouseLeave)事件的处理方法OnFileOpenMouseLeave。例如: private void OnFileOpenMouseLeave(object sender, EventArgs e) promptLabel.Text = 就绪; 4显示鼠标位置信息为状态条分别依次添加名为xLabel、xValLabel、yLabel和yValLabel的标签(需修改“设计”栏的“(Name)”属性值),也修改其“外观”栏的“BackColor”属性值为“系统”列表中的“Control”(默认与窗体背景色相同,如为“Web”中的“White”),将它们“外观”栏“Text”属性的值分别改为“x:”、“0000”、“y:”和“0000”,再将其中的xValLabel和yValLabel标签的“行为”栏的“AutoSize”属性值改为“false”,使其大小固定。为了美观,还可以在yLabel标签之前,插入一个“Text”属性值为单个空格符的标签,将其背景色,也改为“Control”。参见图18-31。为窗体的“MouseMove”事件添加名为“OnMouseMove”的事件处理方法如下: private void OnMouseMove(object sender, MouseEventArgs e) xValLabel.Text = e.X.ToString(); yValLabel.Text = e.Y.ToString(); 运行结果如图18-32所示。图18-31 添加显示鼠标位置信息的状态标签图18-32 显示鼠标位置信息如果你仔细观察,就会发现一个奇怪的现象,客户区最顶端的y坐标,并不是0而是50。这是因为,窗体客户区中还包含了位于其顶端的菜单条和工具条,它们各自高25个像素,加起来刚好50像素。我们将在下一节来解决这个问题。18.2 绘图窗体采用GDI+绘图,.NET将GDI+的绘图功能主要封装在System.Drawing和System.Drawing.Drawing2D两个命名空间中。前者封装了GDI+的常用功能,后者则封装了GDI+的高级功能(如条纹刷和渐变刷),参见图18-33。MarshalByRefObjectObjectGraphicsImageBrushPenSolidBrushTextureBrushValueTypeColorPointFFontRectangleFSizeFHatchBrushBitmapStructPathGradientBrushLinearGradientBrushGraphicsPathRegionFontFamilyMetafileEventArgsMouseEventArgs图18-33 GDI+中的常用类型及其基类字体和颜色标明类型所在的命名空间,正常:System、粗体:System.Drawing、斜体:System.Drawing.Drawing2D、灰色:System.Drawing.Imaging18.2.1 画板与图形对象在窗体中,一般是利用GDI+的图形对象,在镶嵌于窗体空白客户区中的画板上绘图。1画板为了使绘图区域是去掉菜单条、工具条、状态条和滚动条等内容后的窗体空白客户区,我们可以为窗体绘图添加一个Panel(画板/面板/镶嵌板)控件,并使该控件充满空白客户区。具体做法是:l 选中“Form1.cs设计”页,打开“工具箱”窗口,展开“容器”项(参见图18-5 a),将画板容器Panel拖入窗体(参见图18-34),系统会自动创建一个画板对象panel1:private System.Windows.Forms.Panel drawPanel;l 利用属性窗口中“设计”栏的名称属性“(Name)”,将其更名为drawPanel。l 设置其“布局”栏的“Dock”(停泊)属性为Fill(充满)(默认为None),参见图18-35。l 设置其“外观”栏的“BackColor”属性为“White”(默认同窗体客户区),参见图18-36。l 设置其“外观”栏的光标属性“Cursor”为十字“Cross”(默认为“Default”,对应

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论