C# WinForms打印三件套:PrintDocument、PrintDialog与PrintPreviewDialog实战

江屿
江屿
发布时间:2026-10-14 | 4人浏览过
原创

在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事件以编写具体的绘图逻辑。

  1. 实例化对象:创建PrintDocument变量。
  2. 设置纸张:通过DefaultPageSettings.PaperSize属性指定纸张类型。例如自定义大小为500x500像素的纸张。
  3. 注册事件:为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可以让用户在正式打印前调整设置(如份数、页面范围),并进行最终确认。

  1. 创建对话框:实例化PrintDialog。
  2. 启用高级对话框:将UseEXDialog属性设为true,以显示现代风格的系统打印对话框。
  3. 关联文档:将PrintDocument赋值给对话框的Document属性。
  4. 执行逻辑:调用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允许用户在屏幕上查看分页后的最终效果。

  1. 创建预览对话框:实例化PrintPreviewDialog。
  2. 绑定文档:将PrintDocument赋值给预览对话框的Document属性。
  3. 显示与行动:调用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#打印模块开发优化与排错的文章请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表