C# WinForms打印三件套:PrintDocument、PrintDialog与PrintPreviewDialog实战
在C# Windows Forms开发中,打印功能是常见的业务需求。本文将详细讲解如何利用PrintDocument控制输出内容,配合PrintDialog让用户选择打印机和设置参数,并使用PrintPreviewDialog预先查看效果。通过完整的代码示例,掌握这三个核心类协同工作的正确姿势。
结果或目标
在Windows桌面应用程序中,用户点击按钮后,能够弹出标准系统打印对话框确认,或在预览窗口中检查排版无误后进行实际打印输出。
准备条件
- 运行环境:.NET Framework 4.x 或 .NET Core / .NET 5+(需安装
System.Windows.Forms包)。 - 必要引用:
System.Drawing,System.Drawing.Printing,System.Windows.Forms。 - 注意:
PrintDocument属于绘图库,而对话框控件属于窗体库,两者需在不同命名空间中引用。
真实操作顺序
第1步:配置PrintDocument并处理页面绘制
打印的核心是PrintDocument对象,它负责定义要打印的内容。你需要实例化该对象,设置纸张规格,并订阅PrintPage事件以编写具体的绘图逻辑。
- 实例化对象:创建
PrintDocument变量。 - 设置纸张:通过
DefaultPageSettings.PaperSize属性指定纸张类型。例如自定义大小为500x500像素的纸张。 - 注册事件:为
PrintPage事件添加处理程序。在该事件中,使用e.Graphics对象绘制文字、图片或图表。
using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
public partial class Form1 : Form
{
private void button1_Click(object sender, EventArgs e)
{
// 1. 实例化打印文档
PrintDocument printDocument1 = new PrintDocument();
// 2. 设置纸张大小 (名称, 宽, 高) - 单位通常为十分之一英寸或像素,取决于Unit设置
printDocument1.DefaultPageSettings.PaperSize = new PaperSize("Custom", 500, 500);
// 3. 绑定页面绘制事件
printDocument1.PrintPage += PrintDocument_PrintPage;
// 后续步骤:结合对话框使用
ShowPrintUI(printDocument1);
}
private void PrintDocument_PrintPage(object sender, PrintPageEventArgs e)
{
// 绘制内容示例:红色黑体字 "Hello World!"
Font font = new Font(new FontFamily("黑体"), 24);
e.Graphics.DrawString("Hello World!", font, Brushes.Red, 50, 50);
}
}
第2步:集成PrintDialog确认打印
直接调用printDocument.Print()会立即发送给默认打印机,这通常不是最佳体验。引入PrintDialog可以让用户在正式打印前调整设置(如份数、页面范围),并进行最终确认。
- 创建对话框:实例化
PrintDialog。 - 启用高级对话框:将
UseEXDialog属性设为true,以显示现代风格的系统打印对话框。 - 关联文档:将
PrintDocument赋值给对话框的Document属性。 - 执行逻辑:调用
ShowDialog(),仅当返回结果为DialogResult.OK时,才调用printDocument.Print()开始打印。
// 接续上述代码片段
private void ShowPrintUI(PrintDocument doc)
{
// 初始化打印对话框
PrintDialog printDialog1 = new PrintDialog();
// 必须设置为True才能显示标准的Windows打印对话框
printDialog1.UseEXDialog = true;
// 关联PrintDocument
printDialog1.Document = doc;
// 显示对话框并判断用户是否点击“打印”
if (printDialog1.ShowDialog() == DialogResult.OK)
{
// 用户确认后,才开始打印过程
doc.Print();
}
}
此时,界面将呈现标准的系统打印对话框,用户可在其中选择打印机并点击确定触发打印。
第3步:添加PrintPreviewDialog预览功能
为避免打印错误造成纸张浪费,增加预览环节是非常必要的。PrintPreviewDialog允许用户在屏幕上查看分页后的最终效果。
- 创建预览对话框:实例化
PrintPreviewDialog。 - 绑定文档:将
PrintDocument赋值给预览对话框的Document属性。 - 显示与行动:调用
ShowDialog()展示预览窗口。如果用户点击预览框内的“打印”按钮或关闭预览后选择确认,则执行打印。
private void ShowPrintPreview(PrintDocument doc)
{
// 初始化打印预览对话框
PrintPreviewDialog printPreviewDialog1 = new PrintPreviewDialog();
// 将PrintDocument赋值给预览对话框
printPreviewDialog1.Document = doc;
// 打开预览对话框
// 注意:PrintPreviewDialog内置了打印按钮,用户可以直接在预览页点击打印
// 如果需要严格遵循“预览->确认->打印”流程,可在此判断返回值
if (printPreviewDialog1.ShowDialog() == DialogResult.OK)
{
// 此处在部分场景下可选,因为预览框内已有直接打印按钮
// 若需强制流程,可在用户从预览关闭窗口并手动触发时调用
doc.Print();
}
}
预览对话框会模拟纸张布局,清晰展示文字、图片的分页位置,帮助用户提前发现排版问题。
关键区别与注意事项
- 命名空间差异:
PrintDocument位于System.Drawing.Printing,而PrintDialog和PrintPreviewDialog位于System.Windows.Forms。切勿混淆引用。 - 事件驱动:
PrintPage是按需触发的。如果文档有多页,需要在处理程序中通过e.HasMorePages = true来指示还有下一页,否则只会打印一页。 - 资源释放:
Graphics对象由框架自动管理,但自定义的Font和Brush最好在使用后Dispose,或在Using语句块中声明,以防止内存泄漏。
完成判断
成功编译并运行程序,点击按钮后能依次出现或独立弹出打印设置对话框、预览窗口,并在确认/预览后,物理打印机输出包含“Hello World!”的纸质文档,即表示配置成功。
以上就是C# WinForms中PrintDocument、PrintDialog与PrintPreviewDialog协同使用的详细内容,更多关于C#打印模块开发优化与排错的文章请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









