我有一个override Paint()
带有我自己的图纸的 UserControl。我想允许用户打印它。
因为我已经花了很多时间写了一个public void Draw(Graphics e)
我希望重用这个方法并且只是通过PrintEventArgs.Graphics
. 我意识到这并不是那么简单。我什至不得不自己翻页。
是否可以使用类似于 OpenGL“投影矩阵”的东西来计算“最佳拟合”或“100% 比例”类型的打印功能?
Graphics 对象具有 Matrix 类型的 Transform 属性,可用于缩放、旋转等绘制的图形,其方式与 OpenGL 矩阵非常相似。
我会将用户绘图移动到一个单独的方法中,如下所示:
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;
};