1.2.1 创建Windows Forms应用程序
如果读者是熟悉其他Windows平台软件开发的开发人员,那么对于Windows Forms一定不会陌生。Windows Forms提供了与其他Windows开发工具,比如Delphi等相同的开发Windows应用程序的能力,如下所示。
● 可视化窗体继承特性:可以定义一个窗口模板,提供一些必备的功能。例如,创建一个具有工具栏、菜单栏及模板代码的用户界面,子窗体通过继承基窗体的特性,大大提高开发人员的生产力,促进了代码的重用。
● 功能强大的数据绑定功能:.NET Framework 1.1提供了较弱的数据绑定特性,开发人员不得不创建大量的代码来进行数据绑定,而且极不灵活。.NET Framework 2.0到现在的.NET Framework 3.5,数据绑定功能得到了极大的完善。通过使用BindingSource控件和增强的强类型数据集,开发人员可以以可视化的方式开发Windows Forms应用程序。
Windows Forms的优越性还有很多,比如精确定位的能力、强大的图形处理功能等,下面新建一个简单的Windows Forms应用程序,来了解一下其结构,步骤如下所示:
① 打开VS 2008,选择主菜单中的“文件”|“新建”命令,在弹出的“新建项目”窗口中,选择“Windows窗体应用程序”模板,如图1.21所示。
图1.21 新建Windows窗体应用程序
为应用程序指定名称为SimpleFormDemo,单击“确定”按钮,VS 2008将会自动创建一个名为Form1.cs的主窗体文件,一个Program.cs的应用程序入口点文件。Program.cs中定义了一个静态的Program类,该类中定义了一个静态的Main()方法,应用程序在启动时将执行该方法。该方法的代码如下所示。
代码位置:见光盘中本章源代码的Program.cs类。
01 static class Program 02 { 03 /// <summary> 04 /// 应用程序的主入口点。 05 /// </summary> 06 [STAThread] 07 static void Main() 08 { 09 Application.EnableVisualStyles(); //启用视觉样式支持 10 Application.SetCompatibleTextRenderingDefault(false); 11 Application.Run(new Form1()); //启动Form1作为应用程序的主窗口 12 } 13 }
● 第09行代码调用Application类的EnableVisualStyles()方法,指示如果控件和操作系统支持视觉样式,则控件将以视觉样式进行绘制。
● 第10行代码调用SetCompatibleTextRenderingDefault指定使用兼容的文本输出。
● 第11行代码的Run方法是一个非常重要的方法,它将处理Windows消息,接收各种事件。为其传入的窗体实例表示这是一个应用程序的主窗体。
在Windows Forms中,每个应用程序都要有一个Application,且只能有一个Application对象实例,示例代码中使用了Application类的静态方法设置了应用程序级别的属性。在示例代码中将Form1对象实例作为Run方法的参数,那么Form1将作为应用程序的主窗体。当Form关闭时,整个应用程序将退出。
② 在VS 2008的文档视图选中Form1,在属性窗口中设置Text属性为记事本,指定Name属性为FrmMain,从工具箱中拖一个MenuStrip控件到桌面上,添加如图1.22所示的菜单栏,然后拖放一个RichTextBox控件,设置其Dock属性为Fill。最后添加一个StatusStrip控件到窗体上,显示为一个状态条。
图1.22 记事本示例界面
③ 实现了用户界面与菜单后,接下来为菜单进行编码。当用户单击“新建”菜单项时,将执行如下的代码来新建一个文本文件。
代码位置:见光盘中本章源代码的Form1.cs类。
01 private void 新建ToolStripMenuItem_Click(object sender, EventArgs e) 02 { 03 if (richTextBox1.Modified) 04 { //判断用户是否更改了文本 05 if (MessageBox.Show("当前文本已经改变,是否要进行保存?", "保存确认", 06 MessageBoxButtons.YesNo) == DialogResult.OK) 07 { 08 string filename = this.Text; //文件名 09 if (filename == "未命名") //如果文件未命名 10 { 11 SaveFileAs(); //调用另存为的功能 12 richTextBox1.Clear(); //清空 13 this.Text = "未命名"; //指定文件名 14 toolStripStatusLabel1.Text = "当前文档:" + this.Text; 15 } 16 else 17 { 18 SaveFile(filename); //调用保存文件方法 19 richTextBox1.Clear(); //清空 20 this.Text = "未命名"; //指定名称 21 toolStripStatusLabel1.Text = "当前文档:" + this.Text; 22 } 23 } 24 else 25 { 26 richTextBox1.Clear(); //直接清空 27 this.Text = "未命名"; //指定名称 28 toolStripStatusLabel1.Text = "当前文档:" + this.Text; 29 } 30 } 31 this.Text = "未命名"; //如果没有修改,指定未命名 32 } 33 private void SaveFile(string fileName) 34 { 35 richTextBox1.SaveFile //调用RichTextBox的SaveFile方法 36 (fileName, RichTextBoxStreamType.PlainText); 37 } 38 private int SaveFileAs() 39 { //SaveFileAs将弹出一个保存文件对话框 40 SaveFileDialog objSaveFile=new SaveFileDialog(); 41 int result=0; 42 objSaveFile.DefaultExt = "*.txt"; //指定扩展名 43 objSaveFile.RestoreDirectory = true; 44 objSaveFile.Filter = "文本文件(*.txt)|*.txt";//过滤器 45 if(objSaveFile.ShowDialog() //判断用户是否单击了OK 46 DialogResult.OK &&objSaveFile.FileName!=string.Empty) 47 { 48 richTextBox1.SaveFile //调用SaveFile方法保存为纯文本 49 (objSaveFile.FileName, RichTextBoxStreamType.PlainText); 50 result = 1; 51 } 52 return result; //返回保存结果 53 }
● 第03行代码判断用户是否在RichTextBox控件中修改了内容,如果修改了,在单击新建菜单项时,将弹出当前文本已经改变的对话框,提示用户进行保存。
● 第05~22行在用户单击了确定保存按钮后,根据当前文件的命名,如果是未命名,则调用SaveFileAs()方法进行文件另存为,否则调用SaveFile()自定义方法保存到指定文件名中。
● 第24~29行代码在用户取消保存时,直接清空文本框,进行新建初始化工作。
● 第33~37行代码调用了RichTextBox控件的SaveFile()方法,将文本信息保存为纯文本。
● 第38~52行的SaveFileAs()方法将首先弹出一个“保存文件”对话框,然后初始化“保存文件”对话框,根据用户选择文件名调用SaveFile()方法保存文件。
④ 如果用户单击“打开”菜单项,将弹出一个“打开文件”窗口,要求用户选择要打开的文本文件,用户选择后将在RichTextBox控件中打开文本文件,代码如下所示。
代码位置:见光盘中本章源代码的Form1.cs类。
01 private void 打开ToolStripMenuItem_Click(object sender, EventArgs e) 02 { 03 string fileName; //文件名称 04 string filetempPath; 05 filetempPath = OpenFile(); //调用OpenFile方法打开文件 06 filePath = Path.GetDirectoryName(filetempPath); //获取路径 07 fileName = Path.GetFileName(filetempPath) ; //获取文件名 08 this.Text = fileName; //显示文件名 09 toolStripStatusLabel1.Text = //在状态栏中显示 10 toolStripStatusLabel1.Text = "当前文档:" + this.Text; 11 } 12 private string OpenFile() 13 { //OpenFile方法用于显示打开对话框,并LoadFile 14 OpenFileDialog objOpenFile = new OpenFileDialog(); 15 string filePath=string.Empty; //获取文件路径 16 objOpenFile.Filter = "文本文件(*.txt)|*.txt"; 17 objOpenFile.DefaultExt = "*.txt"; 18 if (objOpenFile.ShowDialog() == //打开文件对话框 19 DialogResult.OK && objOpenFile.FileName != string.Empty) 20 { 21 richTextBox1.LoadFile //加载文件 22 (objOpenFile.FileName, RichTextBoxStreamType.PlainText); 23 filePath = objOpenFile.FileName; //获取文件路径和文件名 24 } 25 return filePath; //返回文件路径和文件名 26 }
● 第03~04行代码定义了两个临时的变量,用来保存文件名和临时的文件路径信息。
● 第05~08行代码调用OpenFile()方法打开文件,返回打开的文件名,第06行代码将文件路径保存到类私有变量中。第07行代码获取文件名,第08~09行代码则在标题栏和状态栏显示文件信息。
● 第12~25行代码的OpenFile()方法首先打开一个“打开文件”对话框,要求用户选择一个文本文件,然后RichTextBox控件将用户选择的文本加载到文本框中。
⑤ “保存”和“另存为”菜单项调用了SaveFile()和SaveFileAs()这两个方法,代码如下所示。
代码位置:见光盘中本章源代码的Form1.cs类。
01 private void 保存ToolStripMenuItem_Click(object sender, EventArgs e) 02 { 03 string fileName; //保存文件名的变量 04 int done; 05 if (this.Text == "未命名") 06 { 07 done = SaveFileAs(); //如果未命名文件,则调用SaveFileAs()方法 08 if (done == 1) 09 { 10 MessageBox.Show("文件已经成功保存"); //如果保存成功,显示成功消息 11 } 12 } 13 else 14 { 15 fileName = filePath + @"\" + this.Text;//获取文件名 16 SaveFile(fileName); //保存文件 17 } 18 } 19 private void 另存为ToolStripMenuItem_Click(object sender, EventArgs e) 20 { 21 SaveFileAs(); //调用SaveAs()方法保存文件 22 }
● 第03~12行代码判断是否是一个命名的文本文件,如果未命名,则调用SaveFileAs()方法。
● 第13~17行代码在文件为命名文件时,调用SaveFile()方法保存文件。
● 第19~22行的“另存为”菜单项的代码直接调用SaveFileAs()方法进行“另存为”操作。
至此实现了一个简单的记事本,它具有打开、保存、新建等功能。在该示例中演示了如何创建一个简单的Windows Forms应用程序,介绍了如何使用控件、响应控件的事件等操作。