2012-05-02 88 views
3

我想知道是否有一種簡單的方法來打印出C#中的任何控件到打印機。我的具體示例是嘗試將TableLayoutPanel打印到收據中(因此我不必擔心分頁符或任何內容),但我希望能夠打印出發送給我的任何可見對象。現在我必須創建一個位圖,然後做一個TableLayoutPanel.DrawToBitmap,但這看起來效率很低,因爲我已經有了用於打印的圖形對象,應該有一個簡單的方法來做到這一點..謝謝!打印控件

編輯:我注意到,有一個「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時,它使用已經呈現的控件的「位圖」,假設控件在開放表單中可見,所以我認爲沒有太多的開銷。當然,你可以直接對圖形進行控制繪圖,這將是一個非常痛苦的屁股,並比較兩種方法的性能。 – 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的例子,但如果這是需要,我可以隨時添加更多的例子。