Windows 窗体对话框的基本代码

Windows 窗体对话框的基本代码


Seth Grossman
Visual Studio Team
Microsoft Corporation
2002 年 1 月

摘要: .NET 框架包含表示 Microsoft Windows 应用程序中经常使用的各种对话框的类。但是,给定对话框的核心功能(即,用于打开文件的 OpenFileDialog 和用于保存文件的 SaveFileDialog)常常并没有在类中实现。本文档中,我们将介绍实现此功能的步骤。

目录

简介

Windows 窗体对话框组件与 Microsoft® Windows® 操作系统中的对话框相同,PrintDialog 组件对应“打印”对话框,OpenFileDialog 组件对应“打开”对话框,等等。

.NET 框架提供的对话框与以前的 Windows 编程和 Microsoft Visual Basic® 6.0 的系统相似,Windows 用户很快就能熟悉这些对话框。通常,可以用多种方法完成给定对话框的工作,例如,使用“打印”对话框打印文件。因此,实际完成任务(打印文件、选择颜色等)的机制并不是作为类的一部分来实现的。这使您可以根据应用程序的需要编写代码,以特定的方式完成这些任务。因此,使用 .NET 框架可以显示标准对话框,但您需要编写自己的逻辑以响应用户在对话框中所做的选择。本文提供了用于实现各个组件的最终用途的示例代码。

注意:有关各个对话框组件的属性、方法和事件的完整列表,请参阅该组件的类的 Members 页。例如,要查找与 OpenFileDialog 组件相关联的方法,您可以在文档索引中查找“OpenFileDialog class, all members”,然后找到包含相关信息的主题。

OpenFileDialog 组件

此对话框使用户能够浏览自己的计算机或网络中任何计算机上的文件夹并打开文件。对话框将返回用户在对话框中选择的文件的路径和名称。

OpenFileDialog 组件(以及将在下文详细讨论的 SaveFileDialog 组件)包含允许用户浏览文件系统并选择文件所需的全部功能。通过使用这两个组件之一,可以省却为此功能编写代码的任务,从而将精力集中在打开和保存文件本身上。

注意:请记住,FileDialog 类的 FilterIndex 属性(由于继承的缘故,该属性同时是 OpenFileDialogSaveFileDialog 类的一部分)是从一开始的索引。下面的某些代码示例使用了此属性(从中也体现了这一特性)。如果要编写代码以便根据文件类型筛选器打开特定的应用程序,或者要以特定格式保存数据(例如,以纯文本及二进制格式保存文件),那么这一点很重要。如果所编写的代码涉及 FilterIndex 属性,请牢记这一点(因为这很容易忘掉)。

下面的代码使用 Button 控件的 Click 事件处理程序打开 OpenFileDialog 组件的实例。当用户选择一个文件并单击 OK(确定)时,将打开在对话框中选择的文件。在下面的示例中,文件在消息框中打开,只是为了表明文件流已被读取。

下面的示例假定 Button 控件名为 Button1OpenFileDialog 组件名为 OpenFileDialog1

' Visual Basic
' 注意:必须导入以下命名空间:
' Imports System.IO
' 如果代码开头没有此导入语句,
' 示例将无法运行。
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
   If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
     Dim sr As New StreamReader(OpenFileDialog1.FileName)
     MessageBox.Show(sr.ReadToEnd)
     sr.Close()
   End If
End Sub

// C#
// 注意:必须导入以下命名空间:
// using System.IO;
// 如果代码开头没有此导入语句,
// 示例将无法运行。
private void button1_Click(object sender, System.EventArgs e)
{
   if(openFileDialog1.ShowDialog() == DialogResult.OK)
   {
     StreamReader sr = new StreamReader(openFileDialog1.FileName);
     MessageBox.Show(sr.ReadToEnd());
     sr.Close();
   }
}

另一种打开文件的方法是使用 OpenFileDialog 组件的 OpenFile 方法,该方法返回构成文件的字节。下面的示例将实例化 OpenFileDialog 组件,并在其上设置一个“光标”筛选器,使用户只能选择光标文件(文件扩展名为 .cur 的文件)。如果选择了一个 .cur 文件,窗体的光标将被设置为所选的光标。

下面的示例假定 Button 控件名为 Button1

' Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
' 显示 OpenFileDialog,以便用户选择光标。
   Dim openFileDialog1 As New OpenFileDialog()
   openFileDialog1.Filter = "光标文件|*.cur"
   openFileDialog1.Title = "选择光标文件"

   ' 显示对话框。
   ' 如果用户在对话框中选择了一个 .CUR 文件并
   ' 单击 OK(确定),则该文件被打开。
   If openFileDialog1.ShowDialog() = DialogResult.OK Then
     If openFileDialog1.FileName <> "" Then
     ' 将流中的光标分配给窗体的 Cursor 属性。
       Me.Cursor = New Cursor(openFileDialog1.OpenFile())
     End If
   End If
End Sub

// C#
private void button1_Click(object sender, System.EventArgs e)
{
// 显示 OpenFileDialog,以便用户选择光标。
   OpenFileDialog openFileDialog1 = new OpenFileDialog();
   openFileDialog1.Filter = "光标文件|*.cur";
   openFileDialog1.Title = "选择光标文件";

   // 显示对话框。
   // 如果用户在对话框中选择了一个 .CUR 文件并
   // 单击 OK(确定),则该文件被打开。
   if (openFileDialog1.ShowDialog() == DialogResult.OK)
   {
     if(openFileDialog1.FileName != "")
     {
       // 将流中的光标分配给窗体的 Cursor 属性。
       this.Cursor = new Cursor(openFileDialog1.OpenFile());
     }
   }
}

有关读取文件流的详细信息,请参阅 FileStream.BeginRead Method(英文)。

SaveFileDialog 组件

此对话框使用户能够浏览文件系统并选择要保存的文件。但是,您必须编写代码以真正将文件写出。

下面的代码使用 Button 控件的 Click 事件处理程序打开 SaveFileDialog 组件的实例。如果用户选择一个文件并单击 OK(确定),窗体的 RichTextBox 控件的内容将被保存到对话框中所选的文件中。

下面的示例假定 Button 控件名为 Button1RichTextBox 控件名为 RichTextBox1SaveFileDialog 组件名为 OpenFileDialog1

' Visual Basic
' 注意:必须导入以下命名空间:
' Imports System.IO
' 如果代码开头没有此导入语句,
' 代码示例将无法运行。
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
   If SaveFileDialog1.ShowDialog() = DialogResult.OK Then
     RichTextBox1.SaveFile(SaveFileDialog1.FileName, _
     RichTextBoxStreamType.PlainText)
   End If
End Sub

// C#
// 注意:必须导入以下命名空间:
// using System.IO;
// 如果代码开头没有此导入语句,
// 代码示例将无法运行。
private void button1_Click(object sender, System.EventArgs e)
{
   if((saveFileDialog1.ShowDialog() == DialogResult.OK)
   {
     richTextBox1.SaveFile(saveFileDialog1.FileName, RichTextBoxStreamType.PlainText);
   }
}

另一种保存文件的方法是使用 SaveFileDialog 组件的 OpenFile 方法,该方法提供一个可以写入的 Stream(英文)对象。

下面的示例中包含一个分配有图像的 Button 控件。如果单击该按钮,将实例化 SaveFileDialog 组件,并且其筛选器接受 .gif、.jpeg 和 .bmp 类型的文件。如果在 Save File(保存文件)对话框中选择上述类型的文件,则按钮的图像将被保存。

下面的示例假定 Button 控件名为 Button2,其 Image 属性被设置为 .gif、.jpeg 或 .bmp 类型的文件。

' Visual Basic
' 注意:必须导入以下命名空间:
' Imports System.IO
' Imports System.Drawing.Imaging
' 如果代码开头没有这些导入语句,
' 代码示例将无法运行。
Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
   ' 显示 SaveFileDialog,以便用户保存
   ' 分配给 Button2 的 Image。
   Dim saveFileDialog1 As New SaveFileDialog()
   saveFileDialog1.Filter = "JPeg 图像|*.jpg|位图图像|*.bmp|Gif 图像|*.gif"
   saveFileDialog1.Title = "保存图像文件"
   saveFileDialog1.ShowDialog()
   
   ' 如果文件名不是空字符串,将打开文件进行保存。
   If saveFileDialog1.FileName <> "" Then
     ' 通过由 OpenFile 方法创建的 FileStream 来保存 Image。
     Dim fs As FileStream = CType(saveFileDialog1.OpenFile(), FileStream)
     ' 根据在对话框中选择的文件类型,以适当的
     ' ImageFormat 来保存 Image。
     ' 注意,FilterIndex 属性是从一开始的。
     Select Case saveFileDialog1.FilterIndex
       Case 1
          Me.button2.Image.Save(fs, ImageFormat.Jpeg)

       Case 2
          Me.button2.Image.Save(fs, ImageFormat.Bmp)

       Case 3
          Me.button2.Image.Save(fs, ImageFormat.Gif)
     End Select

     fs.Close()
   End If
End Sub

// C#
// 注意:必须导入以下命名空间:
// using System.IO;
// using System.Drawing.Imaging;
// 如果代码开头处没有这些导入语句,
// 代码示例将无法运行。
private void button2_Click(object sender, System.EventArgs e)
{
   // 显示 SaveFileDialog,以便用户保存
   // 分配给 Button2 的 Image。
   SaveFileDialog saveFileDialog1 = new SaveFileDialog();
   saveFileDialog1.Filter = "JPeg 图像|*.jpg|位图图像|*.bmp|Gif 图像|*.gif";
   saveFileDialog1.Title = "保存图像文件";
   saveFileDialog1.ShowDialog();

   // 如果文件名不是空字符串,将打开文件进行保存。
   if(saveFileDialog1.FileName != "")
   {
     // 通过由 OpenFile 方法创建的 FileStream 来保存 Image。
     FileStream fs = (FileStream)saveFileDialog1.OpenFile();
     // 根据在对话框中选择的文件类型,以适当的
     // ImageFormat 来保存 Image。
     // 注意,FilterIndex 属性是从一开始的。
     switch(saveFileDialog1.FilterIndex)
     {
       case 1 : 
       this.button2.Image.Save(fs,ImageFormat.Jpeg);
       break;

       case 2 : 
       this.button2.Image.Save(fs,ImageFormat.Bmp);
       break;

       case 3 : 
       this.button2.Image.Save(fs,ImageFormat.Gif);
       break;
     }

   fs.Close();
   }
}

有关写入文件流的详细信息,请参阅 FileStream.BeginWrite Method(英文)。

ColorDialog 组件

此对话框显示颜色列表,并返回包含用户所选颜色的属性。

与前面提到的对话框组件不同,ColorDialog 组件使您能够轻松实现对话框的主要目的(选择颜色)。在对话框中选择的颜色将在 Color 属性中返回。因此,使用用户所选择的颜色就像设置属性一样简单。在下面的示例中,Button 控件的 Click 事件处理程序将打开 ColorDialog 组件。如果用户选择一种颜色并单击 OK(确定),按钮的背景色将被设置为所选的颜色。下面的示例假定 Button 控件名为 Button1ColorDialog 组件名为 ColorDialog1

' Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
   If ColorDialog1.ShowDialog() = DialogResult.OK Then
     Button1.BackColor = ColorDialog1.Color
   End If
End Sub

// C#
private void button1_Click(object sender, System.EventArgs e)
{
   if(colorDialog1.ShowDialog() == DialogResult.OK)
   {
     button1.BackColor = colorDialog1.Color;
   }
}

可以在 ColorDialog 组件上指定的其他属性包括 AllowFullOpen 属性,该属性在设置为 false 时将禁用 Define Custom Colors(定义自定义颜色)按钮,从而使用户只能选择调色板中的预定义颜色;还有 SolidColorOnly 属性,该属性在设置为 true 时将不允许用户选择抖动颜色。

FontDialog 组件

此对话框允许用户选择字体以更改其显示特性,如粗细和大小。

在对话框中选择的字体将在 Font 属性中返回。因此,使用用户所选择的字体就像设置属性一样简单。在下面的示例中,Button 控件的 Click 事件处理程序将打开 FontDialog 组件。如果用户选择一种字体并单击 OK(确定),则窗体上的 TextBox 控件的 Font 属性将被设置为所选的字体。下面的示例假定 Button 控件名为 Button1TextBox 控件名为 TextBox1FontDialog 组件名为 FontDialog1

' Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, _
 ByVal e As System.EventArgs) Handles Button1.Click
   If FontDialog1.ShowDialog() = DialogResult.OK Then
     TextBox1.Font = FontDialog1.Font
   End If
End Sub

// C#
private void button1_Click(object sender, System.EventArgs e)
{
   if(fontDialog1.ShowDialog() == DialogResult.OK)
   {
     textBox1.Font = fontDialog1.Font;
   }
}

可以在 FontDialog 组件上指定的其他属性包括 MinSizeMaxSize 属性,它们确定用户可以选择的最小和最大磅值;还有 ShowColor 属性,该属性在设置为 true 时将在对话框中显示一个下拉框,供用户选择字体的颜色。

PrintDocument 类

下面介绍的三个对话框(PrintDialog 组件、PageSetupDialog 组件和 PrintPreviewDialog 控件)都将使用 PrintDocument 类。PrintDocument 类代表要打印的文档,在此类上设置属性以指定其外观和打印方式,然后,此类的实例将被发送到打印机。通常情况下,需要先实例化 PrintDocument 类的实例,在 PageSetupDialog 组件的实例中设置其属性,打印前在 PrintPreviewDialog 控件的实例中进行查看,然后通过 PrintDialog 组件的实例将其打印出来。

有关 PrintDocument 类的详细信息,请参阅 PrintDocument Class(英文)。

PrintDialog 组件

此对话框使用户能够将文档发送到打印机进行打印。此外,还可以使用该对话框选择打印机,选择要打印的页,以及确定与打印相关的其他设置。通过该对话框,用户能够非常灵活地打印文档。他们可以打印全部文档,也可以打印所选页面范围,或者打印所选内容。

使用 PrintDialog 组件有一个重要问题,那就是它怎样与 PrinterSettings 类进行交互。PrinterSettings 类用于表示打印机功能集的特定选择,如纸张来源、打印机分辨率和双面打印功能。每个设置都表示为 PrinterSettings 类的一个属性。PrintDialog 类可以修改与文档相关联(并且表示为 PrintDocument.PrinterSettings 属性)的 PrinterSettings 类的给定实例的这些属性值。

PrintDialog 组件将包含特定打印机设置的 PrintDocument 类的实例发送到所选打印机。有关使用 PrintDialog 组件将材料发送到打印机进行打印的示例,请参阅 Creating Standard Windows Forms Print Jobs(英文)。

PageSetupDialog 组件

PageSetupDialog 组件用于向用户显示布局、纸张大小和其他页面布局选项。与所有其他对话框一样,您可以使用 ShowDialog 方法来显示 PageSetupDialog 组件。此外,您需要指定 PrintDocument 类的实例,也就是要打印的文档。而且,用户的计算机上必须连接了打印机(在本地或通过网络),因为这会影响 PageSetupDialog 组件确定对用户显示哪些页面格式设置选项。

使用 PageSetupDialog 组件有一个重要问题,那就是它怎样与 PageSettings 类进行交互。PageSettings 类用于指定修改页面打印方式(如纸张方向、页面大小和页边距)的设置。每个设置都表示为 PageSettings 类的一个属性。PageSetupDialog 类可以修改与文档相关联(并且表示为 PrintDocument.DefaultPageSettings 属性)的 PageSettings 类的给定实例的这些属性值。

下面的代码使用 Button 控件的 Click 事件处理程序打开 PageSetupDialog 组件的实例。在 Document 属性中指定了一个现有文档,其 Color 属性被设置为 false

下面的示例假定 Button 控件名为 Button1PrintDocument 组件名为 myDocumentPageSetupDialog 组件名为 PageSetupDialog1

' Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
   ' 下面使用的打印文档“myDocument”
   ' 仅用作示例。
   ' 您必须指定自己的打印文档。
   PageSetupDialog1.Document = myDocument
   ' 将打印文档的颜色设置设为 false,
   ' 就不会打印出彩色页面。
   PageSetupDialog1.Document.DefaultPageSettings.Color = False
   PageSetupDialog1.ShowDialog()
End Sub

// C#
private void button1_Click(object sender, System.EventArgs e)
{
   // 下面使用的打印文档“myDocument”
   // 仅用作示例。
   // 您必须指定自己的打印文档。
   pageSetupDialog1.Document = myDocument;
   // 将打印文档的颜色设置设为 false,
   // 就不会打印出彩色页面。
   pageSetupDialog1.Document.DefaultPageSettings.Color = false;
   pageSetupDialog1.ShowDialog();
}

PrintPreviewDialog 控件

与其他影响应用程序或控件的对话框不同,PrintPreviewDialog 控件在对话框自身范围内显示其大部分功能。此对话框通常用于在打印之前显示文档。

与所有其他对话框一样,您可以使用 ShowDialog 方法来显示 PrintPreviewDialog 控件。此外,您需要指定 PrintDocument 类的实例,也就是要打印的文档。

注意:在使用 PrintPreviewDialog 控件时,计算机必须连接了打印机(在本地或通过网络),因为这会影响 PrintPreviewDialog 组件确定文档的打印外观。

PrintDialog 组件一样,PrintPreviewDialog 控件也使用 PrinterSettings 类。此外,与 PageSetupDialog 组件一样,PrintPreviewDialog 控件还使用 PageSettings 类。在 PrintPreviewDialog 控件的 Document 属性中指定的打印文档将引用 PrinterSettingsPageSettings 类的实例,用于在预览窗口中呈现文档。

下面的代码使用 Button 控件的 Click 事件处理程序打开 PrintPreviewDialog 控件的实例。打印文档在 Document 属性中指定。注意,下面的示例没有指定打印文档。

下面的示例假定 Button 控件名为 Button1PrintDocument 组件名为 myDocumentPrintPreviewDialog 控件名为 PrintPreviewDialog1

' Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, _
 ByVal e As System.EventArgs) Handles Button1.Click
   ' 下面使用的打印文档“myDocument”
   ' 仅用作示例。
   ' 您必须指定自己的打印文档。
   PrintPreviewDialog1.Document = myDocument
   PrintPreviewDialog1.ShowDialog()
End Sub

// C#
private void button1_Click(object sender, System.EventArgs e)
{
   // 下面使用的打印文档“myDocument”
   // 仅用作示例。
   // 您必须指定自己的打印文档。
   printPreviewDialog1.Document = myDocument;
   printPreviewDialog1.ShowDialog()
}

总结

.NET 框架包括许多 Windows 用户常见的对话框,这使您很容易就能在自己的应用程序中包含这些熟悉的用户交互内容。通常,有多种方法可以完成对话框的任务,在这方面,.NET 框架保持了其体系结构的开放性,因此,您可以编写最适合您的应用程序的方法。以上,我们介绍了完成与对话框组件相关联的任务的一些简单方法。本文提供了一些简单代码,您可以直接使用或将其改写后用于您自己的应用程序。

posted on 2006-02-17 13:59  教程.net  阅读(1243)  评论(0编辑  收藏  举报

导航