30天学通C#项目案例开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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应用程序,介绍了如何使用控件、响应控件的事件等操作。