




已阅读5页,还剩51页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第18章 C# 窗体编程Windows窗体(Form,形状/表单)原来是Visual Basic程序的用户界面,后来成为.NET程序的GUI,被Visual Studio中的C#、Visual Basic、F#、MC+和C+/CLI等开发语言工具所使用,后来又从Visual C+ 2005起被引入到MFC编程中。作为应用程序的基本单元,窗体实质上只是一个(类似于对话框的)简单框架窗口,内含一块空白板(客户区)。开发人员可通过添加控件(包括菜单条、工具条、状态条、计时器和公用对话框等)来创建用户界面,并通过编写代码来操作数据,从而填充这个空白板。为此,Visual Studio提供了一个有助于编写代码的集成开发环境,以及一个针对.NET框架编程的丰富的控件集。通过使用代码来补充这些控件的功能,可以方便快捷地开发所需要的解决方案。由于时间有限,本章只介绍C# 窗体编程一些基本内容。相关帮助文档的位置:l 窗体编程:“库主页Visual Studio 2010Visual Studio 创建基于Windows的应用程序Windows 窗体”。l .NET类库:“库主页Visual Studio 2010.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# 项目),代码文件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# 窗体编程界面FormContainerControlScrollableControlControlComponentMarshalByRefObjectForm1Object窗体设计所用的工具箱内容丰富,除了VB动力包(Visual Basic PowerPacks)栏(5种)、“报表”栏(1种)和“WPF互操作性”栏(1种)的工具外,其余所有可用的工具位于“所有Windows窗体”栏中(只是缺少了“数据”栏中VS2010新增加的“图表”工具),共有66种。其下各栏将这些工具分门别类地列出,包括:“公共控件”(21种)、“容器”(6种)、“菜单和工具栏”(5种)、“数据”(5种)、“组件”(14种)、“打印”(5种)和“对话框”(5种),共计62种,参见图18-5。只有DomainUpDown(域上下)、PropertyGrid(属性网格)、Splitter(拆分条)、HScrollBar(水平滚动条)、VScrollBar(垂直滚动条)和TrackBar(跟踪条)这5种工具没有包含在这些分类栏中。另外,在窗体编程中,工具栏的“对话框编辑器”栏和“常规”栏为空。3代码文件内容自动生成的程序代码,定义了一个与项目同名的命名空间,还定义了用户的应用程序类Program(基类为默认的System.Object)和派生的窗体类Form1(基类为System.Windows. Forms.Form,参见图18-6),后者被定义在两个同名的部分类(分别位于Form1.cs和Form1.Designer.cs者两个代码文件)中。图18-6 Form1及其各级基类1)Program.cs自动生成的Program.cs代码为: a) 公共控件、容器b) 菜单和工具栏、数据、组件 c) 打印、对话框、WPF互操作性、报表、VB动力包 图18-5 窗体工具箱using System;using System.Collections.Generic;using System.Linq;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.Windows.Forms;namespace FormDraw public partial class Form1 : Form public Form1() InitializeComponent(); 3)Form1.Designer.cs代码文件Form1.Designer.cs包含了窗体部分类Form1的另一部分定义,用于存放系统自动生成的窗体设计代码。下面是该文件的初始代码: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)。也可以自己通过为项目添加新建图标项,来创建新图标资源,如FormDraw.ico (默认位于项目所在目录)。可以通过“项目添加新项”菜单项(或按对应的快捷键Ctrl+Shift+A)来完成,参见图18-8和9。然后,在窗体设计界面所对应的属性窗口中,将“窗口样式”栏的图标项“Icon”右边的图案,通过其右端的浏览钮来更换。图18-7 窗体属性l 设计:名称(Name)相当于MFC中的ID,对应于窗体的类名。默认为Form1(似VB),可以改成自己喜欢的名称,如DrawForm,回车确认后,系统会自动修改所有相关内容中的该标识符。图18-10 设置窗体的背景色l 外观:背景色BackColor默认为系统的控件色Control(一般为黄灰色,与对话框的背景色相同),可以点击该属性右端的下三角按钮,选择自己喜欢的颜色,如“自定义”页上的白色。参见图18-10。 l 外观:背景图片BackgroundImage默认无,可以自己为窗体添加背景图。并通过BackgroundImageLayout属性,来设置图片的填充方式(默认为Tile平铺,还可以选择中心Center、伸展Stretch和缩放Zoom)。图18-8 添加新项对话框 a) 默认的新图标b) 自己设计的图标图18-9 添加新的图标项l 外观:光标Cursor默认为Default(箭头Arrow)。可以选十字Cross,参见图18-11。l 外观:文本Text对应于窗体的标题,默认也为Form1,可以改为自己喜欢的标题,如“窗体绘图”。结果窗体如图18-12所示。1添加菜单条与MFC会自动为应用程序编程生成和添加菜单条、工具条和状态条不同,Visual C# 为窗体程序自动生成的只是一个简单的空白框架窗口,菜单条、工具条和状态条等都需要我们自己手工来添加。选中“Form1.cs设计”页,打开“工具箱”窗口,展开“菜单和工具栏”项,里面有菜单条(MenuStrip)、工具条(ToolStrip)和状态条(StatusStrip)等控件,参见图18-5 b)。它们都是C# 2.0新增加的控件类,分别用来替换老版本中的MainMenu、ToolBar和StatusBar等控件类,参见图18-13。为了兼容性,2.0版中仍然保留了这些老版本中的类,但是建议在编程中使用新的控件类。 图18-11 可选光标图18-12 窗体外观ScrollableControlControlComponentMarshalByRefObjectObjectToolStripMenuStripStatusStripStatusBarToolBarMainMenuMenu图18-13 新老菜单条、工具条和状态条控件类及其基类选中“工具箱”窗口的“菜单和工具栏”中的“MenuStrip”项,拖放到窗体中,系统则会自动为窗体添加一个停靠在标题条下的菜单条,参见图18-14。并在Form1.Designer.cs 文件的部分窗体类定义的“Windows 窗体设计器生成的代码”区域后自动添加如下一行代码,来定义该菜单条所对应的菜单条类的实例对象menuStrip1:private System.Windows.Forms.MenuStrip menuStrip1;可以通过菜单条“属性”窗口中“设计”栏中的名称属性“(Name)”来修改该对象的变量名称,如mainMenuStrip,回车确认后,系统会自动修改项目中的所有相关部分的代码。2添加菜单项可以像在MFC中一样,为菜单条添加菜单项和访问键&X,参见图18-14 a)。但是添加快捷键(shortcut key)、设置选中(checked)状态、添加图片、添加提示串等,C# 都比MFC方便,可以直接利用属性窗口,直观交互式地完成。在菜单条中 ,除了添加菜单项外,你还可以利用下拉式列表来为菜单条添加分隔符(ToolStripSeparator类的对象,参见图18-18)、文本框和组合框,参见图18-14 b)。 a) 添加菜单项和访问键 b) 添加分隔条、文本框和组合框图18-14 添加菜单条成员 图18-15 设置快捷键可以通过在属性窗口底部的“杂项”栏中的“ShortcutKeys”项来设置快捷键(参见图18-15),按回车键完成。注意,设置快捷键后,系统会自动地将它作为默认串显示在菜单项的右端,不需要(也不支持)自己在菜单项自己编写诸如“tCtrl+N”的显式串。但是可以在属性窗口的“外观”栏的“ShortcutKeyDisplayString”属性中,输入自己的显示串,来代替默认的串。只有在该属性值为空时,系统才会显示默认的快捷键串。在C# 的窗体编程中,为菜单项添加小图片是非常容易的。只需在属性窗口的“外观”栏的“Image”属性中,单击右端的浏览钮,在弹出的对话框中,按“导入”钮,在弹出的“打开”对话框中,选择要装入图片资源即可,参见图18-16。与图标一样,你也可以自己创建位图资源(12*11像素,*.bmp)后再选入,参见图18-17。一般还需要为图片设置透明色,这可以通过属性窗口的“外观”栏中的“ImageTransparentColor”属性来进行,方法与前面设置窗体背景色类似。你也可以选中菜单项后,直接按鼠标右键,在弹出的浮动菜单中,选“设置图像(M).”菜单项,来设置该菜单项的图片。注意,MFC会为应用程序自动生成包含“新建”、“打开”等常用按钮的工具条位图文件Toolbar.bmp。但是在Visual C# 的窗体编程中,得我们自己来创建和添加这些位图。不过,你也可以从VS安装目录的“Samples1033”子目录的压缩文件“VC2010Samples.zip”的“C+/Language/General/scribble/Images/”子目录中获得。图18-16 选择菜单项图片图18-17 添加位图资源新项对话框ComponentMarshalByRefObjectObjectToolStripItemToolStripButtonToolStripDropDownItemToolStripMenuItemToolStripSeparatorToolStripLabelToolStripStatusLabel图18-18 菜单项、按钮、状态标签和分隔符类及其基类你还可以利用“属性”窗口的“行为”栏中的“ToolTipText”属性,为菜单项添加鼠标滑过时的文本提示串。每当你为窗体添加一个菜单项,系统就会自动添加一个对应的菜单项对象(似添加菜单条),如打开菜单项的对象定义为:private System.Windows.Forms.ToolStripMenuItem 打开OToolStripMenuItem;它们都是ToolStripMenuItem类(参见图18-18)的实例对象,默认的对象名为:菜单项名+访问键字母+ToolStripMenuItem,如上面的“打开OToolStripMenuItem”。你也可以修改此对象名,如改为open。3添加菜单响应选中菜单项,选择“属性”窗口的事件页,在“操作”栏的“Click”属性中,键入响应方法的名称,如OnFileOpen。回车确认后,系统会自动在Form1.cs文件中的窗体部分类定义中,添加带空方法体的事件处理方法。例如: private void OnFileOpen (object sender, EventArgs e) 可以添加自己的处理代码,如打开文件公用对话框,获取用户选择的(带路径的)文件名。这需要先将工具箱窗口的“对话框”栏中的“OpenFileDialog”控件,拖放到窗体。系统会自动为窗体类添加对应的实例对象,默认的名称为openFileDialog1:private System.Windows.Forms.OpenFileDialog openFileDialog1;可以属性窗口顶部的下拉式列表中,选择openFileDialog1项,在属性页中修改“设计”栏的“(Name)”属性的值,达到修改该对象名的目的,如改成openFileDlg。则可以编写打开公用文件对话框的代码如下: private void OnFileOpen(object sender, EventArgs e) if (openFileDlg.ShowDialog() = DialogResult.OK) string fn = openFileDlg.FileName; 类似地,你也可以为“新建”菜单项,添加OnFileNew事件处理方法,并在其中使用MessageBox类的Show静态方法来显示一个弹出式消息对话框。例如: 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-1 枚举类型MessageBoxButtons的成员成员名称说明AbortRetryIgnore消息框包含“中止”、“重试”和“忽略”按钮。OK消息框包含“确定”按钮。OKCancel消息框包含“确定”和“取消”按钮。RetryCancel消息框包含“重试”和“取消”按钮。YesNo消息框包含“是”和“否”按钮。YesNoCancel消息框包含“是”、“否”和“取消”按钮。例如(参见图18-19):MessageBox.Show(创建新文档!);MessageBox.Show(创建新文档!, 提示信息);MessageBox.Show(创建新文档?, 请选择, MessageBoxButtons.YesNo); 图18-19 MessageBox的不同Show重载方法的输出5添加退出菜单项默认的窗体,是利用关闭窗口来退出应用程序。我们也可以为窗体的“文件”菜单,添加“退出”或“关闭”菜单项,利用应用程序类的Exit静态方法,来退出正在运行的应用程序。具体做法是:l 在现有的文件菜单项后,添加一个分隔符,参见图18-20 a)。 a) 添加分隔符b) 添加退出菜单项图18-20 添加分隔符和退出菜单项l 添加退出菜单项(参见图18-20 b)):n 设置其菜单名或其“外观”栏的“Text”属性的值为“退出(&X)”。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-21 a)。并在Form1.Designer.cs 文件中自动添加定义该工具条所对应的工具条类的实例对象toolStrip1:private System.Windows.Forms.ToolStrip toolStrip1;它是ToolStrip类(参见图18-13)的实例对象。也可以通过工具条的“属性”窗口中“设计”栏中的名称属性“(Name)”来修改该对象的变量名称,如toolStrip。回车确认后,系统也会自动修改项目中的所有相关部分的代码。a) 添加工具条b) 添加按钮图18-21 添加工具条与按钮2添加按钮利用工具条的添加新项的下拉式列表,可以为工具条添加多种成员(参见图18-21 b)),常用的是按钮与分隔符(ToolStripSeparator类的对象,参见图18-17)。新添加按钮时,系统也会在Form1.Designer.cs 文件中自动添加一个对应的按钮对象:private System.Windows.Forms.ToolStripButton toolStripButton1;它们都是ToolStripButton类(参见图18-18)的实例对象,默认的对象名为:toolStripButtoni。你也可以修改此对象名,如改为openButton。默认的按钮图片为System.Drawing.Bitmap,可以通过“属性”窗口“外观”栏中的“Image”属性或直接在按钮上按鼠标右键,在弹出的浮动菜单中选“设置图像(M).”菜单项,来修改(装入或创建)按钮图片,具体方法与为菜单项添加图片类似。最好采用与对应菜单项相同的图片。你还可以利用“属性”窗口“外观”栏中的“Text”属性或“行为”栏中的“ToolTipText”属性,为按钮添加鼠标滑过时的文本提示串(默认为“toolStripButton i”),如“打开文件”。3添加按钮响应为工具条上的按钮添加消息响应的方法与为菜单条添加菜单项响应的方法类似:选中按钮,选择“属性”窗口的事件页,在“操作”栏的“Click”属性中,利用该属性项右端的下拉式列表,选择对应菜单项的响应方法名,如OnFileOpen,一般不需要键入和创建新的消息响应方法。4动态修改按钮颜色一个设置颜色的按钮,可以让它随着用户选择的颜色而改变。我们的做法是去掉按钮的图片,动态修改其背景色属性。具体步骤为:l 在工具条中添加按钮,修改其“(Name)”属性(对象名)为“setColButton”。l 将其“Image”属性改为“(无)”。l 在窗体类DrawForm的构造函数中,设置其背景色属性为初始颜色。如: public DrawForm() InitializeComponent();/ col为类变量,初值为Color.Green setColButton.BackColor = col; l 在用户选择新的颜色,设置其背景色属性为当前颜色。如: 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-22。并在Form1.Designer.cs 文件中自动添加定义该状态条所对应的状态条类的实例对象statusStrip1:private System.Windows.Forms.StatusStrip statusStrip1;它是StatusStrip类(参见图18-13)的实例对象。也可以通过工具条的“属性”窗口中“设计”栏中的名称属性“(Name)”来修改该对象的变量名称,如statusStrip。 图18-22 添加状态条图18-23 状态条成员与拆分按钮成员2添加状态标签可以添加到状态条中的成员(参见图18-23 a))有状态标签(StatusLabel)、进度条(ProgressBar)、下拉式按钮(DropDownButton)和拆分按钮(SplitButton),其中的拆分按钮又含有若干成员,参见图18-23 b)。常用的是状态标签,它可以用于显示提示信息和各种状态数据,如当前鼠标位置等。为状态条添加状态标签时,系统会在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-24)为“MiddleLeft”(默认为“MiddleCenter”)。l 修改其“外观”栏的“Spring”(弹性)属性值为“true”(默认为false)。最后一个属性为true时,该标签会自动伸缩,始终充满状态条的剩余空间。修改前的样子和修改后的结果参见图18-25。图18-24 设置文本对齐属性值图18-25 添加显示提示信息用的状态标签与MFC不同,C# 窗体中的状态条并不能自动显示菜单项和工具条按钮的提示信息,而必须自己写代码来完成该任务。例如,可以为打开菜单和按钮添加同一个“MouseHover(鼠标悬停)” 事件(即鼠标在对应菜单项或按钮上停留一段时间后所触发的事件)的事件处理方法OnFileOpenMouseHover,并为该方法添加设置提示标签文本属性值的语句: private void OnFileOpenMouseHover(object sender, EventArgs e) promptLabel.Text = 打开文档文件; 当然,你也可以通过为菜单项或按钮添加鼠标进入(MouseEnter)或鼠标单击(Click)等事件的处理方法,来显示提示信息。为了在鼠标离开菜单项或按钮后,还原“就绪”信息,可以添加对鼠标离开(MouseLeave)事件的处理方法。例如: 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-26。图18-26 添加显示鼠标位置信息的诸状态标签图18-27 显示鼠标位置信息为窗体的“MouseMove”事件添加名为“OnMouseMove”的事件处理方法如下: private void OnMouseMove(object sender, MouseEventArgs e) xValLabel.Text = e.X.ToString(); yValLabel.Text = e.Y.ToString(); 运行结果如图18-27所示。如果你仔细观察,就会发现一个奇怪的现象,客户区最顶端的y坐标,并不是0而是49。这是因为,窗体客户区中还包含了位于其顶端的菜单条和工具条,它们各自高24个像素,加起来刚好48像素。我们将在下一节来解决这个问题。18.2 绘图窗体采用GDI+绘图,.NET将GDI+的绘图功能主要封装在System.Drawing和System.Drawing.Drawing2D两个命名空间中。前者封装了GDI+的常用功能,后者则封装了GDI+的高级功能。参见图18-28。MarshalByRefObjectObjectGraphicsImageBrushPenSolidBrushTextureBrushValueTypeColorPointFFontRectangleFSizeFHatchBrushBitmapStructPathGradientBrushLinearGradientBrushGraphicsPathRegionFontFamilyMetafileEventArgsMouseEventArgs图18-28 GDI+中的常用类型及其基类字体和颜色标明类型所在的命名空间,正常:System、粗体:System.Drawing、斜体:System.Drawing.Drawing2D、灰色:System.Drawing.Imaging18.2.1 画板与图形对象在窗体中,一般是利用GDI+的图形对象,在镶嵌于窗体空白客户区中的画板上绘图。1画板为了使绘图区域是去掉菜单条、工具条、状态条和滚动条等内容后的窗体空白客户区,我们可以为窗体绘图添加一个Panel(画板/面板/镶嵌板)控件,并使该控件充满空白客户区。具体做法是:l 选中“Form1.cs设计”页,打开“工具箱”窗口,展开“容器”项(参见图18-5 a),将Panel容器拖入窗体(参见图18-29)。系统会自动创建一个画板对象panel1,可以更名为drawPanel:private System.Windows.Forms.Panel drawPanel;l 设置其“布局”栏的“Dock”(停泊)属性为Fill(充满)(默认为None),参见图18-30。l 设置其“外观”栏的“BackColor”属性为“White”(默认同窗体客户区),参见图18-31。因为此时,窗体的客户区被画板覆盖,所以原来我们为窗体编写的鼠标移动事件处理方法,现在已经不起作用。解决办法是,将选择窗体的OnMouseMove方法,也选为画板的“MouseMove”事件的处理方法。 图18-29 将画板容器拖入窗体 图18-30 设置画板的 图18-31 设置停泊和背景色停泊属性为Fill属性后的画板 2图形类.NET的图形类及其他各种相关类、结构、枚举等类型,都与GDI+中的同名。里面的常量、方法、枚举值也几乎完全相同。所以,有了前面的第14章的GDI+基础,现在在.NET的窗体中绘图,那就是小菜一碟了。.NET框架的图形类Graphics,位于System.Drawing命名空间中。参见图18-27。为了在窗体或画板中绘图,必须先创建对应的图形对象。这可以使用它们从Control类继承下来的CreateGraphics方法:public Graphics CreateGraphics ()例如:Graphics graph = drawPanel.CreateGraphics();有了图形对象,我们就可以使用图形类中各种绘图方法了。例如:graph.DrawLine(pen, x0, y0, e.X, e.Y);graph.DrawRectangle(pen, l, t, w, h);graph.FillRectangle(brush, l, t, w, h);graph.DrawEllipse(pen, l, t, w, h);graph.FillEllipse(brush, l, t, w, h);3辅助类与结构与GDI+一样,.NET框架中也有Pen(笔类),Brush(虚拟刷类)、SoildBrush(实心刷类)、HatchBrush(条纹刷类)、TextureBrush(纹理刷
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人数字化隐秘保护的承诺书(4篇)
- 2025-2030化妆品新原料备案加速政策对产品创新周期影响分析
- 2025-2030化妆品专营店数字化转型与会员体系重构报告
- 2025-2030制造业自动化行业智能工厂市场需求发展研究报告
- 营销数据分析及市场策略模板
- 2025-2030冷链物流行业转型升级与区域发展机遇研究报告
- 2025-2030冷链物流用相变材料性能优化与成本控制研究
- 2025-2030冷链物流市场规模测算及区域发展机遇分析
- 2025-2030冷链物流基础设施建设缺口及投资优先级评估报告
- 证券基金从业考试题库及答案解析
- 2025年大学辅导员招聘考试题库:学生心理危机干预方案设计试题
- 2024-2025学年广东省广大附中大联盟九年级(上)期中联考道法试题及答案
- 塔吊使用安全事故应急救援预案
- 中国烟草招聘考试真题2024
- 2025江苏南京市玄武区卫生健康委员会所属事业单位招聘工作人员23人备考考试题库附答案解析
- 人教PEP版四年级英语上册 Unit 2 My friends 单元测试卷(含答案含听力原文)
- 2025新疆医科大学第一附属医院招聘事业单位编制外工作人员(119人)考试参考题库及答案解析
- 2024年湖南省中考数学真题及答案解析
- 2025年艾灸行业研究报告及未来行业发展趋势预测
- 世界少年奥林匹克思维能力测评地方选拔活动2024-2025学年六年级上学期数学竞赛试题B卷
- 四年级数学上册第1单元《 大数的认识 》作业设计
评论
0/150
提交评论