0

我有一个override Paint()带有我自己的图纸的 UserControl。我想允许用户打印它。

因为我已经花了很多时间写了一个public void Draw(Graphics e)我希望重用这个方法并且只是通过PrintEventArgs.Graphics. 我意识到这并不是那么简单。我什至不得不自己翻页。

是否可以使用类似于 OpenGL“投影矩阵”的东西来计算“最佳拟合”或“100% 比例”类型的打印功能?

4

2 回答 2

0

Graphics 对象具有 Matrix 类型的 Transform 属性,可用于缩放、旋转等绘制的图形,其方式与 OpenGL 矩阵非常相似。

于 2012-08-27T16:38:39.350 回答
0

我会将用户绘图移动到一个单独的方法中,如下所示:

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        Rectangle client=new Rectangle(0, 0, ClientSize.Width-1, ClientSize.Height-1);
        Render(e.Graphics, client);
    }

    public void Render(Graphics g, Rectangle client)
    {
        g.DrawEllipse(Pens.Blue, client); //test draw
        //...
    }

然后从打印文档中调用它:

    private void button1_Click(object sender, EventArgs e)
    {
        PrintPreviewDialog dlg=new PrintPreviewDialog();
        PrintDocument doc=new PrintDocument();

        doc.PrintPage+=(s, pe) =>
        {
            userControl11.Render(pe.Graphics, pe.PageBounds); // user drawing
            pe.HasMorePages=false;                
        };
        doc.EndPrint+=(s, pe) => { dlg.Activate(); };
        dlg.Document=doc;
        dlg.Show();            
    }

结果: 截图

编辑 1 要在打印输出中保持相同数量的像素,然后将打印例程修改为:

        doc.PrintPage+=(s, pe) =>
        {
            Rectangle client = new Rectangle(
                pe.PageBounds.Left, 
                pe.PageBounds.Top,
                userControl11.ClientSize.Width-1,
                userControl11.ClientSize.Height-1 );
            userControl11.Render(pe.Graphics, client);
            pe.HasMorePages=false;                
        };
于 2012-08-27T17:20:44.240 回答