65.9K
CodeProject 正在变化。 阅读更多。
Home

增强的 PrintPreviewDialog

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (37投票s)

2009 年 4 月 23 日

CPOL

3分钟阅读

viewsIcon

83035

downloadIcon

5379

一个增强的 PrintPreviewDialog,具有更好的外观、本地化、自动页码和附加文本。

引言

Windows Forms 中包含的经典 PrintPreviewDialog 在实际应用程序的上下文中存在严重限制。

  • 您无法自定义用户界面或添加功能。
  • 唯一支持的语言是英语,并且无法本地化。因此,如果您的应用程序使用其他语言,则会出现界面不一致的情况。
  • 用户无法选择打印机,也无法修改页面设置。这些任务应该在打开预览对话框之前,在其他地方完成!
  • 它的工具栏和按钮采用旧式外观。换句话说,它真的很丑。

因此,我感到有必要实现自己的预览,并试图克服上述问题。

工作原理

EnhancedPrintPreviewDialog 派生自 Form。它包含一个工具栏,并使用标准的 PrintPreviewControl。第一项任务是重新创建预览对话框的功能,填充工具栏,并实现适当的处理程序以与预览控件进行交互。

与原始预览对话框一样,基本属性是 Document,它属于 PrintDocument 类型。当将 PrintDocument 分配给此属性时,将为文档的 BeginPrintPrintPageEndPrint 事件附加一些处理程序。BeginPrint 处理程序重置一个页面计数器变量,PrintPage 处理程序递增计数器,EndPrint 处理程序在界面中显示总页数。

之后,我考虑添加一个允许自动插入附加文本(包括页码)的功能。因此,引入了 AdditionalText 类以及对话框的 AdditionalTextList 属性。修改了 PrintPage 处理程序以打印附加文本。

类架构

EnhancedPrintPreviewDialog 类

您将使用主类来代替 PrintPreviewDialog

  • Document:获取或设置与此 EnhancedPrintPreviewDialog 相关的 PrintDocument
  • PageSetupDialog:获取或设置一个 PageSetupDialog。如果未提供,则会创建一个默认的 PageSetupDialog 对象。
  • PrintDialog:获取或设置一个 PrintDialog。如果未提供,则会创建一个默认的 PrintDialog 对象。
  • PrintPreviewControl:获取 PrintPreviewControl
  • ShowPageSettingsButton:获取或设置一个布尔值,指示是否在工具栏中显示页面设置按钮。
  • ShowPrinterSettingsButton:获取或设置一个布尔值,指示是否在工具栏中显示打印设置按钮。
  • ShowPrinterSettingsBeforePrint:获取或设置一个布尔值,指示在将数据发送到打印机之前是否显示打印对话框。
  • UseAntiAlias:获取或设置一个布尔值,指示是否应用抗锯齿。
  • AdditionalTextList:获取或设置要打印在内容周围的 AdditionalText 对象列表。如果未提供,则会创建一个默认的空 List<AdditionalText>

AdditionalText 类

此类包含有关要显示在内容周围的附加文本的信息。

  • Brush:要使用的 Brush
  • Color:要使用的 Color。如果设置此属性,则画笔将自动设置为 SolidBrush 实例。
  • Font:要使用的 Font
  • OffsetX:文本的水平偏移量。它可以是负数。
  • OffsetY:文本的垂直偏移量。它可以是负数。
  • Position:文本的位置。
  • Text:要打印的文本。如果字符串包含 $pagenumber 占位符,它将被替换为当前页码。

本地化

EnhancedPrintPreviewDialog 附带默认的英语语言资源和附加的意大利语语言资源。您可以按照以下步骤轻松添加您的特定语言。

在文件系统中,复制 EnhancedPrintPreviewDialog.it-IT.resx 文件,并使用您的语言和国家/地区后缀(例如:“fr-FR”)重命名它。

在 Visual Studio 的解决方案资源管理器中,单击“显示所有文件”按钮。

然后,右键单击复制的文件,然后选择“包含到项目”。

双击文件以打开资源编辑器,并编辑字符串。在 comment 列中,您将找到要翻译的英文文本。

要测试除您的默认语言以外的语言,您可以强制当前线程的区域性。

using System.Threading;
using System.Globalization;
...
public Form1() {
    InitializeComponent();
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("it-IT");
    ..
}

Using the Code

在您的项目中,添加对 PrintPreview.dll 的引用。在您的代码中,导入 VR.PrintPreview 命名空间。

using VR.PrintPreview;

以与使用经典 PrintPreviewDialog 相同的方式使用 EnhancedPrintPreviewDialog

EnhancedPrintPreviewDialog NewPreview = new EnhancedPrintPreviewDialog();
NewPreview.Document = sample.PrintDocument;
NewPreview.ShowDialog();

使用新属性来设置附加功能。

NewPreview.AdditionalTextList.Add(new AdditionalText(
      "Page - $pagenumber -"         // text
     , new Font("Comic sans MS", 10) // font
     , Brushes.Red                   // brush
     , TextPosition.HBottomLeft      // position
     , 0                             // OffsetX
     , 0                             // OffsetY
     )
);
© . All rights reserved.