3

C# のコントロールをプリンターに出力する簡単な方法があるかどうか疑問に思っていました。私の具体的な例では、TableLayoutPanel をレシートに印刷しようとしています (改ページなどを心配する必要はありません) が、送信された可視オブジェクトを印刷する機能が必要です。現在、ビットマップを作成してから TableLayoutPanel.DrawToBitmap を実行する必要がありますが、これは非常に非効率的であり、印刷用の Graphics オブジェクトが既にあるため、これを行う簡単な方法があるはずです..ありがとう!

編集:「ControlPaint.Draw__」があることに気付きましたが、描画できるコントロールがあまりありません (Border、Button、CheckBox、ComboBox があります)。

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」オブジェクトを作成し、グリッド、画像、その他表示する必要のあるものを含む「Paragraphs」を追加します。他の回答は承認済みとしてマークしたままにしますが、私が最終的に行った方向に誰かが興味を持っている場合に備えて、これを追加すると考えました。

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 に答える