18窗体编程.docx
《18窗体编程.docx》由会员分享,可在线阅读,更多相关《18窗体编程.docx(69页珍藏版)》请在冰豆网上搜索。
18窗体编程
第18章窗体编程
Windows窗体(Form,形状/表单)原来是VisualBasic程序的用户界面,后来成为.NET程序的GUI,被VisualStudio中的C#、VisualBasic、F#、MC++和C++/CLI等开发语言工具所使用,后来又从VisualC++2005起被引入到MFC编程中。
作为应用程序的基本单元,窗体实质上只是一个(类似于对话框的)简单框架窗口,内含一块空白板(客户区)。
开发人员可通过添加控件(包括菜单条、工具条、状态条、计时器和公用对话框等)来创建用户界面,并通过编写代码来操作数据,从而填充这个空白板。
为此,VisualStudio提供了一个有助于编写代码的集成开发环境,以及一个针对.NET框架编程的丰富的控件集。
通过使用代码来补充这些控件的功能,可以方便快捷地开发所需要的解决方案。
由于时间有限,本章只介绍C#窗体编程一些基本内容。
相关帮助文档的位置:
●窗体编程:
“库主页\VisualStudio2010\VisualStudio\创建基于Windows的应用程序\Windows窗体”。
●.NET类库:
“库主页\VisualStudio2010\.NETFramework类库”中的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),选左边“已安装的模板”栏的“其他语言\VisualC#”项,再选中间栏的“Windows窗体应用程序”模板。
选择父目录位置后,输入项目名称“FormDraw”,去选“为解决方案创建目录”复选框,按“确定”钮关闭对话框。
图18-1窗体编程中常用.NET类型的层次结构
字体和颜色标明类型所在的命名空间,正常:
System、粗体:
System.Windows.Forms、
斜体:
System.Drawing、粗斜体:
System.Drawing.Drawing2D、灰色:
System.ComponentModel
图18-2交互式窗体绘图程序
图18-3新建项目对话框
1.项目目录和文件
VisualStudio会自动创建名为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-4C#窗体编程界面
窗体设计所用的工具箱内容丰富,除了VB动力包(VisualBasicPowerPacks)栏(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.代码文件内容
图18-6Form1及其各级基类
自动生成的程序代码,定义了一个与项目同名的命名空间,还定义了用户的应用程序类Program(基类为默认的System.Object)和派生的窗体类Form1(基类为System.Windows.Forms.Form,参见图18-6),后者被定义在两个同名的部分类(分别位于Form1.cs和Form1.Designer.cs者两个代码文件)中。
a)公共控件、容器b)菜单和工具栏、数据、组件c)打印、对话框、WPF互操作性、
报表、VB动力包
图18-5窗体工具箱
1)Program.cs
自动生成的Program.cs代码为:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Windows.Forms;
namespaceFormDraw
{
staticclassProgram
{
///
///应用程序的主入口点。
///
[STAThread]
staticvoidMain()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(newForm1());
}
}
}
该文件中的代码主要是定义了Program类,它包含Main入口主程序。
Main方法中最重要的语句为:
Application.Run(newForm1());
它创建窗体Form1对象,并以其为程序界面(主框架窗口)来运行窗体应用程序。
2)Form1.cs
代码文件Form1.cs包含了窗体部分类Form1的一部分定义,用于程序员编写事件处理代码,也是我们今后工作的主要对象。
可以在“解决方案资源管理器”页中,选中“Form1.cs”项后,按鼠标右键,在弹出的浮动菜单中选“查看代码(C)”菜单项,来以源代码方式打开该文件。
下面是该文件的初始代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
namespaceFormDraw
{
publicpartialclassForm1:
Form
{
publicForm1()
{
InitializeComponent();
}
}
}
3)Form1.Designer.cs
代码文件Form1.Designer.cs包含了窗体部分类Form1的另一部分定义,用于存放系统自动生成的窗体设计代码。
下面是该文件的初始代码:
namespaceFormDraw
{
partialclassForm1
{
///
///必需的设计器变量。
///
privateSystem.ComponentModel.IContainercomponents=null;
///
///清理所有正在使用的资源。
///
///如果应释放托管资源,为true;否则为false。
protectedoverridevoidDispose(booldisposing)
{
if(disposing&&(components!
=null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#regionWindows窗体设计器生成的代码
///
///设计器支持所需的方法-不要
///使用代码编辑器修改此方法的内容。
///
privatevoidInitializeComponent()
{
ponents=
newSystem.ComponentModel.Container();
this.AutoScaleMode=
System.Windows.Forms.AutoScaleMode.Font;
this.Text="Form1";
}
#endregion
}
}
4.Application类
密封类Application也位于System.Windows.Forms.Form命名空间中,直接派生于System.Object。
下面是它的定义:
publicsealedclassApplication
Application类具有用于启动和停止应用程序和线程、启用可视界面、以及处理Windows消息的方法,如下所示:
●Run——在当前线程上启动应用程序消息循环,并可以选择使某窗体可见。
常用的重载版为:
publicstaticvoidRun(FormmainForm)。
●Exit或ExitThread——停止消息循环。
常用的重载版为:
publicstaticvoidExit()。
●EnableVisualStyles——此方法为应用程序启用可视样式。
如果控件和操作系统支持视觉样式,则控件将以视觉样式进行绘制。
若要使EnableVisualStyles生效,必须在应用程序中创建任何控件之前调用它;EnableVisualStyles通常是Main函数的第一行。
当调用EnableVisualStyles时,无需单独的清单即可启用可视化样式。
语法为:
publicstaticvoidEnableVisualStyles()。
●SetCompatibleTextRenderingDefault——该方法用于设置兼容文本的默认表示方式。
语法为:
publicstaticvoidSetCompatibleTextRenderingDefault(booldefaultValue)
●DoEvents——在您的程序处于某个循环中时处理消息。
●AddMessageFilter——向应用程序消息泵添加消息筛选器来监视Windows消息。
●IMessageFilter——使您可以阻止引发某事件或在调用某事件处理程序前执行特殊操作。
该类还具有用于获取或设置当前线程的区域性信息的CurrentCultur和CurrentInputLanguage属性。
不能从此类派生新类(密封类)。
18.1.2修改窗体属性
窗体的属性有很多(参见图18-7),其中常用的有:
●布局:
大小Size——默认为300*300像素,可以通过修改此属性,或直接拖动窗体的边框来改变窗体的尺寸。
运行时用户也可以自己改变窗体大小。
●窗口样式:
图标Icon——默认为
,可以通过为点击该属性条目右端浏览钮,装入新的图标文件(16*16和32*32像素,*.ico)。
也可以自己通过为项目添加新建图标项,来创建新图标资源,如FormDraw.ico
(默认位于项目所在目录)。
可以通过“项目\添加新项”菜单项(或按对应的快捷键Ctrl+Shift+A)来完成,参见图18-8和9。
然后,在窗体设计界面所对应的属性窗口中,将“窗口样式”栏的图标项“Icon”右边的图案,通过其右端的浏览钮
来更换。
图18-7窗体属性
●
设计:
名称(Name)——相当于MFC中的ID,对应于窗体的类名。
默认为Form1(似VB),可以改成自己喜欢的名称,如DrawForm,回车确认后,系统会自动修改所有相关内容中的该标识符。
●
图18-10设置窗体的背景色
外观:
背景色BackColor——默认为系统的控件色Control(一般为黄灰色,与对话框的背景色相同),可以点击该属性右端的下三角按钮,选择自己喜欢的颜色,如“自定义”页上的白色。
参见图18-10。
●外观:
背景图片BackgroundImage——默认无,可以自己为窗体添加背景图。
并通过BackgroundImageLayout属性,来设置图片的填充方式(默认为Tile平铺,还可以选择中心Center、伸展Stretch和缩放Zoom)。
图18-8添加新项对话框
a)默认的新图标b)自己设计的图标
图18-9添加新的图标项
●外观:
光标Cursor——默认为Default(箭头Arrow)。
可以选十字Cross,参见图18-11。
●外观:
文本Text——对应于窗体的标题,默认也为Form1,可以改为自己喜欢的标题,如“窗体绘图”。
结果窗体如图18-12所示。
1.添加菜单条
与MFC会自动为应用程序编程生成和添加菜单条、工具条和状态条不同,VisualC#为窗体程序自动生成的只是一个简单的空白框架窗口,菜单条、工具条和状态条等都需要我们自己手工来添加。
选中“Form1.cs[设计]”页,打开“工具箱”窗口,展开“菜单和工具栏”项,里面有菜单条(MenuStrip)、工具条(ToolStrip)和状态条(StatusStrip)等控件,参见图18-5b)。
它们都是C#2.0新增加的控件类,分别用来替换老版本中的MainMenu、ToolBar和StatusBar等控件类,参见图18-13。
为了兼容性,2.0版中仍然保留了这些老版本中的类,但是建议在编程中使用新的控件类。
图18-11可选光标图18-12窗体外观
图18-13新老菜单条、工具条和状态条控件类及其基类
选中“工具箱”窗口的“菜单和工具栏”中的“MenuStrip”项,拖放到窗体中,系统则会自动为窗体添加一个停靠在标题条下的菜单条,参见图18-14。
并在Form1.Designer.cs文件的部分窗体类定义的“Windows窗体设计器生成的代码”区域后自动添加如下一行代码,来定义该菜单条所对应的菜单条类的实例对象menuStrip1:
privateSystem.Windows.Forms.MenuStripmenuStrip1;
可以通过菜单条“属性”窗口中“设计”栏中的名称属性“(Name)”来修改该对象的变量名称,如mainMenuStrip,回车确认后,系统会自动修改项目中的所有相关部分的代码。
2.添加菜单项
可以像在MFC中一样,为菜单条添加菜单项和访问键&X,参见图18-14a)。
但是添加快捷键(shortcutkey)、设置选中(checked)状态、添加图片、添加提示串等,C#都比MFC方便,可以直接利用属性窗口,直观交互式地完成。
在菜单条中,除了添加菜单项外,你还可以利用下拉式列表来为菜单条添加分隔符(ToolStripSeparator类的对象,参见图18-18)、文本框和组合框,参见图18-14b)。
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。
但是在VisualC#的窗体编程中,得我们自己来创建和添加这些位图。
不过,你也可以从VS安装目录的“Samples\1033\”子目录的压缩文件“VC2010Samples.zip”的“C++/Language/General/scribble/Images/”子目录中获得。
图18-16选择菜单项图片
图18-17添加位图资源新项对话框
图18-18菜单项、按钮、状态标签和分隔符类及其基类
你还可以利用“属性”窗口的“行为”栏中的“ToolTipText”属性,为菜单项添加鼠标滑过时的文本提示串。
每当你为窗体添加一个菜单项,系统就会自动添加一个对应的菜单项对象(似添加菜单条),如打开菜单项的对象定义为:
privateSystem.Windows.Forms.ToolStripMenuItem打开OToolStripMenuItem;
它们都是ToolStripMenuItem类(参见图18-18)的实例对象,默认的对象名为:
菜单项名+访问键字母+ToolStripMenuItem,如上面的“打开OToolStripMenuItem”。
你也可以修改此对象名,如改为open。
3.添加菜单响应
选中菜单项,选择“属性”窗口的事件
页,在“操作”栏的“Click”属性中,键入响应方法的名称,如OnFileOpen。
回车确认后,系统会自动在Form1.cs文件中的窗体部分类定义中,添加带空方法体的事件处理方法。
例如:
privatevoidOnFileOpen(objectsender,EventArgse)
{
}
可以添加自己的处理代码,如打开文件公用对话框,获取用户选择的(带路径的)文件名。
这需要先将工具箱窗口的“对话框”栏中的“OpenFileDialog”控件,拖放到窗体。
系统会自动为窗体类添加对应的实例对象,默认的名称为openFileDialog1:
privateSystem.Windows.Forms.OpenFileDialogopenFileDialog1;
可以属性窗口顶部的下拉式列表中,选择openFileDialog1项,在属性页中修改“设计”栏的“(Name)”属性的值,达到修改该对象名的目的,如改成openFileDlg。
则可以编写打开公用文件对话框的代码如下:
privatevoidOnFileOpen(objectsender,EventArgse)
{
if(openFileDlg.ShowDialog()==DialogResult.OK){
stringfn=openFileDlg.FileName;
}
}
类似地,你也可以为“新建”菜单项,添加OnFileNew事件处理方法,并在其中使用MessageBox类的Show静态方法来显示一个弹出式消息对话框。
例如:
privatevoidOnFileNew(objectsender,EventArgse)
{
MessageBox.Show("创建新文档!
");
}
4.MessageBox类
消息框类MessageBox是System.Object类的直接派生类,位于System.Windows.Forms命名空间中。
其Show静态方法的常用重载格式有:
publicstaticDialogResultShow(stringtext)//无标题
publicstaticDialogResultShow(stringtext,stringcaption)//含“确定”按钮
publicstaticDialogResultShow(stringtext,stringcaption,MessageBoxButtonsbuttons)
其中,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-19MessageBox的不同Show重载方法的输出
5.添加退出菜单项
默认的窗体,是利用关闭窗口来退出应用程序。
我们也可以为窗体的“文件”菜单,添加“退出”或“关闭”菜单项,利用应用程序类的Exit静态方法,来退出正在运行的应用程序。
具体做法是:
●在现有的文件菜单项后,添加一个分隔符,参见图18-20a)。
a)添加分隔符b)添加退出菜单项
图18-20添加分隔符和退出菜单项
●添加退出菜单项(参见图18-20b)):
⏹设置其菜单名或其“外观”栏的“Text”属性的值为“退出(&X)”。
⏹设置其“杂项”栏“ShortcutKeys”属性的值为Alt+F4。
⏹[设置其“设计”栏“