C# 打印控件

C# 打印控件,c#,printing,controls,C#,Printing,Controls,我想知道是否有一种简单的方法可以将C#中的任何控件打印到打印机上。我的具体示例是尝试将TableLayoutPanel打印到收据(这样我就不必担心分页符或其他问题),但我希望能够打印发送给我的任何可见对象。现在我必须创建一个位图,然后执行TableLayoutPanel.DrawToBitmap,但这似乎效率很低,因为我已经有了用于打印的图形对象,所以应该有一种简单的方法来实现这一点。。谢谢 编辑:我注意到有一个“ControlPaint.Draw\uuuuuuuuuuuuuuuuuuuuuuu

我想知道是否有一种简单的方法可以将C#中的任何控件打印到打印机上。我的具体示例是尝试将TableLayoutPanel打印到收据(这样我就不必担心分页符或其他问题),但我希望能够打印发送给我的任何可见对象。现在我必须创建一个位图,然后执行TableLayoutPanel.DrawToBitmap,但这似乎效率很低,因为我已经有了用于打印的图形对象,所以应该有一种简单的方法来实现这一点。。谢谢

编辑:我注意到有一个“ControlPaint.Draw\uuuuuuuuuuuuuuuuuuuuuuuuuuuux”,但是它没有很多可以绘制的控件(它有边框、按钮、复选框、组合框)

它仍然在使用DrawToBitmap,但它是你能得到的最优雅的


它非常简洁,可读性好,效率也不低,所以我看不出有什么理由不喜欢它。

我对自己的问题有一个与以前有所不同的答案。在WPF中,您可以将控件绘制到任何曲面,因此我创建了一个“FlowDocument”对象,并添加了包含网格、图像和其他需要显示的内容的“段落”。我会将另一个答案标记为已接受,但我想我会添加这个,以防有人对我最终的方向感兴趣

FlowDocument flowDoc = new FlowDocument();

Paragraph header = new Paragraph();
Grid imageGrid = new Grid();
imageGrid.ColumnDefinitions.Add(new ColumnDefinition());
ColumnDefinition colDef = new ColumnDefinition();
colDef.Width = new GridLength(4, GridUnitType.Star);
imageGrid.ColumnDefinitions.Add(colDef);
imageGrid.ColumnDefinitions.Add(new ColumnDefinition());

BitmapImage bitImage = new BitmapImage(new Uri("{...}", UriKind.RelativeOrAbsolute));
Image image = new Image();
image.Source = bitImage;
image.Margin = new Thickness(10.0d);

Grid.SetColumn(image, 1);
imageGrid.Children.Add(image);

header.Inlines.Add(imageGrid);
header.Inlines.Add(new LineBreak());

header.Inlines.Add("Some text here");
header.Inlines.Add(new LineBreak());

flowDoc.Blocks.Add(header);

关于如何打印流程文档,应该有很多示例,但如果需要,我可以在示例中添加更多内容。

您可以使用DrawToBitmap方法轻松地将其绘制到位图。在那之后,保存位图并打印它是你可以在谷歌上搜索的东西。就像我说的,这就是我现在正在做的,但是应该有一种更简单/更有效的方法来做到这一点。我的意思是,不管我是在屏幕上还是在纸上打印它,它的行为都应该是一样的……没有先使用DrawToBitmap,就没有一种简单的方法来绘制控件。这在技术上可以通过pinvoke绕过,使用WM_打印消息。然而,“似乎”是一个很糟糕的动机,让自己陷入那种麻烦。打印机的分辨率大大高于屏幕。一些会让你头疼的东西,还有一个“似乎”只是表面上的原因。您最好将时间花在编写代码上,以绘制控件显示的任何内容,这样它就不会看起来像一个cr*ppy粒状的屏幕截图。绘制位图的效率不是很高,尤其是如果您必须多次这样做,然后将其绘制到打印文档中,效率会提高一倍(尤其是与绘制一组直线以生成矩形和文本的速度相比).我知道这与大多数人无关,但我的目标硬件非常低端,它将打印大量收据,因此时间会累积起来。我非常欣赏代码,尽管它非常优雅。我非常确定,当您使用DrawToBitmap时,它使用的是已渲染的“位图”关于控件,假设控件在一个开放的表单中可见,所以我认为不会有太大的开销。当然,您可以将控件绘图直接实现为图形,这将是一件非常痛苦的事情,并比较两种方法的性能。我要打印的控件不会在表单上,我使用它们格式化正在出售的项目列表。在打印文档上绘制位图的过程最慢(在计算机时间内)因为它几乎是一个像素一个像素的。如果你试图用大字体以外的任何字体绘制文本,它看起来也很糟糕。我最终决定自己绘制文本,将项目均匀地隔开。非常感谢你的帮助,但是,如果我需要打印任何其他内容,我可以使用它。
FlowDocument flowDoc = new FlowDocument();

Paragraph header = new Paragraph();
Grid imageGrid = new Grid();
imageGrid.ColumnDefinitions.Add(new ColumnDefinition());
ColumnDefinition colDef = new ColumnDefinition();
colDef.Width = new GridLength(4, GridUnitType.Star);
imageGrid.ColumnDefinitions.Add(colDef);
imageGrid.ColumnDefinitions.Add(new ColumnDefinition());

BitmapImage bitImage = new BitmapImage(new Uri("{...}", UriKind.RelativeOrAbsolute));
Image image = new Image();
image.Source = bitImage;
image.Margin = new Thickness(10.0d);

Grid.SetColumn(image, 1);
imageGrid.Children.Add(image);

header.Inlines.Add(imageGrid);
header.Inlines.Add(new LineBreak());

header.Inlines.Add("Some text here");
header.Inlines.Add(new LineBreak());

flowDoc.Blocks.Add(header);