【问题标题】:Printing contents of controls in C#?在 C# 中打印控件的内容?
【发布时间】:2010-12-13 14:27:27
【问题描述】:

我从未使用 C# 打印过任何东西。我只是想知道这样做的标准方法是什么。在我的表单上,我有一些列表框和一些文本框。我想打印它们的内容并在打印预览中显示它们,并在表格中使用漂亮的布局。然后从他们那里我希望用户能够打印。

提前致谢!

【问题讨论】:

    标签: c# winforms printing


    【解决方案1】:

    这是关于 C# 基本打印的nice little tutorial。它处理文本,但可以轻松扩展以绘制其他任何内容。

    C# 中的打印与 C# 中的自定义绘画非常相似。最大的区别在于坐标系是从屏幕表示中翻转的,并且您必须考虑页面的跨度(如果/必要时)。打印方式也有点违反直觉,因为您必须启动打印过程然后处理页面打印事件。

    示例:

    这是一个打印事件处理程序的简单示例,它假定存在名为 listBox1 的列表框控件,其中包含一些项目。它绘制每个项目以及围绕它的一个框。

    private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
        Font font = new Font("Arial", 10f);
        Graphics g = e.Graphics;
        Pen rectPen = new Pen(Color.Black, 2f);
        Brush brush = Brushes.Black;
    
        // find widest width of items
        for (int i=0; i<listBox1.Items.Count; i++)
            if(maxItemWidth < (int)g.MeasureString(listBox1.Items[i].ToString(), font).Width)
                maxItemWidth = (int)g.MeasureString(listBox1.Items[i].ToString(), font).Width;
    
        // starting positions:
        int itemHeight = (int)g.MeasureString("TEST", font).Height + 5;
        int maxItemWidth = 0;
        int xpos = 200;
        int ypos = 200;
    
        // print
        for (int i = 0; i < listBox1.Items.Count; i++)
        {
            g.DrawRectangle(rectPen, xpos, ypos, maxItemWidth, itemHeight );
            g.DrawString(listBox1.Items[i].ToString(), font, brush, xpos, ypos);
    
            ypos += itemHeight;
        }
    
        e.HasMorePages = false;
    }
    

    【讨论】:

    • 应该明确处理Pen rectPen,还是由GC处理?
    • GC 不处理这个问题。但这也不是一个很好的例子。此代码示例中的三个绘画对象,Font、Pen 和 Brush,实际上是我在类范围内声明的东西,而不是每次调用 PrintPage 处理程序时都重新创建它们。我建议您在其他代码中执行相同的操作。如果我记得你在一些钢笔和画笔周围使用过语句。这是矫枉过正,使代码更难阅读。只需将这些对象移动到类范围,并让它们在应用程序的整个生命周期内都存在。
    • 我喜欢您作为链接提供的nice little tutorial。谢谢,很好用!
    【解决方案2】:

    您将需要使用 System.Drawing.Printing 库。您将使用您可以在MSDN Page with Example 上找到的 PrintDocument.Print 方法

    【讨论】:

    • 这种方法非常完美,因为我已经让用户将信息保存到文本文件中。谢谢!
    • 当我点击您提供的 MSDN 链接时,我收到“找不到内容”错误。
    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 2010-10-11
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多