将2个图形对象合并为双工页面

时间:2014-11-18 09:07:50

标签: c#

我们有一个WinForm程序,它将当前显示的页面发送到打印机。 这非常简单:我们创建一个PrintDocument对象,在PrintPage事件中我们填充图形对象:

    private void PrintPage(object sender, PrintPageEventArgs e)
    {
        _renderObject.RenderPrinter(e.Graphics);
    } 

我不确定这种方法是否仍然是最先进的,但程序已经很老了并且仍在运行,所以它似乎有用。 现在的问题是:我们需要创建一个双面页面并在背面打印一些东西。

我的第一种方法是创建第一个表单初始化的第二个表单,然后在PrintPage事件中编写图形内容,如下所示:

public static class Printer
{
    private static Graphics _e1;
    private static Graphics _e2;

    public static void Print(Graphics e1, Graphics e2)
    {
        PrintDocument pd = new PrintDocument();
        _e1 = e1;
        _e2 = e2;
        pd.PrinterSettings.Duplex = Duplex.Horizontal;

        pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
    }

    static void pd_PrintPage(object sender, PrintPageEventArgs e)
    {
        _renderObject.RenderPrinter(_e1);
        _renderObject.RenderPrinter(_e2);
    }
}

我想我必须基本上将第一页的大小设置为A4,以确保第二个对象打印在背面。

但这真的是正确的方法吗?现在是否更容易创建双面页面而无需手动设置每个控件?或者我的方法是唯一可能使事情发生的方法?

像往常一样感谢提前

的Matthias

1 个答案:

答案 0 :(得分:2)

从我到目前为止看到的情况来看,背面基本上只是另一页,双面打印设置使其背面打印(如果打印机支持它)。

每个页面都会调用一次PrintPage回调。 PrintPageEventArgs对象具有HasMorePages属性,您可以将其设置为true以表示有更多页面必须打印。请注意,它还具有Graphics属性,因此无需传递额外的Graphics个对象。

因此,只需在第一次调用PrintPage时渲染正面,然后将HasMorePages设置为true。第二次调用PrintPage时,您将渲染背面并将HasMorePages设置为false。这确实意味着您必须跟踪您正在打印的那一面。遗憾的是,PrintPageEventArgs不包含任何自定义状态,因此可能有点棘手。你可以使用一个静态变量,但是如果你开始打印作业而另一个仍然被渲染,那么它将会中断。

要解决这个问题,我会使用一个闭包,一个捕获局部变量page的匿名函数:

int page = 0;
pd.PrintPage += (sender, e) =>
{
    if (page == 0)
    {
        // Print front side
        _renderObject.RenderPrinter(e.Graphics);
        e.HasMorePages = true;
    }
    else if (page == 1)
    {
        // TODO: Print back side
        e.HasMorePages = false;
    }

    page += 1;
};