3

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

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

4

2 回答 2

6
private static void PrintControl(Control control)
{
    var bitmap = new Bitmap(control.Width, control.Height);

    control.DrawToBitmap(bitmap, new Rectangle(0, 0, control.Width, control.Height));

    var pd = new PrintDocument();

    pd.PrintPage += (s, e) => e.Graphics.DrawImage(bitmap, 100, 100);
    pd.Print();
}

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

它非常简洁、易读且效率不低,所以我看不出有什么理由不喜欢它。

于 2012-05-02T16:58:07.063 回答
0

我对我自己的问题有一个答案,这个答案与我之前的方向有些不同。在 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);

并且应该有很多关于如何打印出 FlowDocument 的示例,但是如果需要,我总是可以在示例中添加更多内容。

于 2015-04-21T17:32:45.230 回答