2012-05-02 15 views
3

C#のコントロールをプリンタに簡単に印刷する方法があるかどうかは疑問でした。私の具体的な例は、領収書にTableLayoutPanelを印刷しようとしています(私はページ区切りなどについて心配する必要はありません)が、私に送信される可視オブジェクトをすべて印刷する機能が欲しいです。今、私はビットマップを作成し、次にTableLayoutPanel.DrawToBitmapを実行する必要がありますが、これは非常に非効率的で、印刷用のGraphicsオブジェクトを既に持っているので、これを行う簡単な方法があります。コントロールを印刷する

編集:私はしかし、それは引くことが可能であるコントロールの多くを持っていない、「ControlPaint.Draw__」があることに気づいた(それは持っているボーダー、ボタン、チェックボックス、コンボボックス)...

+0

DrawToBitmapメソッドを使用すると、ビットマップに簡単に描画できます。その後、ビットマップを保存して印刷することができます。 – SimpleVar

+0

私が言ったように、それは私が今やっていることですが、それを行うためのより簡単で効率的な方法があるはずです。つまり、スクリーンや紙に印刷するかどうかは関係ありません。同じ方法で動作するはずです... –

+0

まずDrawToBitmapを使用せずにコントロールを描画する簡単な方法はありません。 – SimpleVar

答えて

5
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を使用していますが、それは最も優雅です。

これはかなり簡潔で読みやすく、非効率的ではないので、私はそれを気に入らない理由は見当たりません。

+0

ビットマップを描画するのは非常に効率的ではありません。特に、複数回実行する必要があり、それらをPrintDocumentに描画すると効率が悪くなります(特に、複数の描画線を描画する速度長方形とテキスト)。私はそれがほとんどの人には関係ないと知っていますが、私のターゲットハードウェアはかなりローエンドで、多くの領収書が印刷されるため、時間が足りるでしょう。私はコードを、しかし、それはかなりエレガントです感謝します。 –

+0

DrawToBitmapを使用すると、コントロールが既に開いているフォームで表示されていると仮定して、コントロールのレンダリングされた「ビットマップ」を使用するので、オーバーヘッドが大きくなるとは思われません。もちろん、グラフィックスに直接制御描画を実装することができます。これはお尻のひどい痛みになり、2つのアプローチのパフォーマンスを比較します。 – SimpleVar

+0

私が印刷しようとしていたコントロールは、フォーム上にはないでしょう。私はそれらを使って、販売されていたアイテムのリストを整形していました。ビットマップをPrintDocumentに描画するプロセスは、ピクセル単位でかなり進んでいるため、最も遅い(コンピュータ時)。あなたが大きなフォント以外のものでテキストを描こうとしているのなら、それはかなりひどいものです。私は最終的にアイテムを均等に間隔を置いてテキストを描くだけで解決しました。でも助けてくれてありがとう、何かを印刷する必要があるなら、私はそれを使うことができます。 –

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をプリントアウトする方法の例がたくさんある必要があり、それが必要なのならば、私はいつもの例にさらに追加することができます。

関連する問題