2011-09-13 44 views
11

我想打印我现在这个代码我的RichTextBox(eintragRichTextBox) 的内容:C#打印(RichTextBox中)

private void druckenPictureBox_Click(object sender, EventArgs e) 
{ 
    PrintDialog printDialog = new PrintDialog(); 
    PrintDocument documentToPrint = new PrintDocument(); 
    printDialog.Document = documentToPrint; 

    if (printDialog.ShowDialog() == DialogResult.OK) 
    { 
     StringReader reader = new StringReader(eintragRichTextBox.Text); 
     documentToPrint.Print(); 
     documentToPrint.PrintPage += new PrintPageEventHandler(DocumentToPrint_PrintPage); 
    } 
} 

private void DocumentToPrint_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) 
{ 
    StringReader reader = new StringReader(eintragRichTextBox.Text); 
    float LinesPerPage = 0; 
    float YPosition = 0; 
    int Count = 0; 
    float LeftMargin = e.MarginBounds.Left; 
    float TopMargin = e.MarginBounds.Top; 
    string Line = null; 
    Font PrintFont = this.eintragRichTextBox.Font; 
    SolidBrush PrintBrush = new SolidBrush(Color.Black); 

    LinesPerPage = e.MarginBounds.Height/PrintFont.GetHeight(e.Graphics); 

    while (Count < LinesPerPage && ((Line = reader.ReadLine()) != null)) 
    { 
     YPosition = TopMargin + (Count * PrintFont.GetHeight(e.Graphics)); 
     e.Graphics.DrawString(Line, PrintFont, PrintBrush, LeftMargin, YPosition, new StringFormat()); 
     Count++; 
    } 

    if (Line != null) 
    { 
     e.HasMorePages = true; 
    } 
    else 
    { 
     e.HasMorePages = false; 
    } 
    PrintBrush.Dispose(); 
} 

但它始终打印我一个空白网站:(..任何人一个想法,为什么它不工作 或者已经有人一个更好的代码/想法我怎么能实现印刷

编辑:?? 看答案

+0

你为什么要在documentToPrint.Print()之前创建这个:“StringReader reader ...”?我认为你不需要那里。阿苏,当你调试时会发生什么? –

+0

我还没有发现你的问题,但有一点是,如果你的实时出价有足够的文本来填写多个页面,你会发现它打印无限数量的页面。您需要声明您的Reader,Count和Line值超出PrintPage事件的范围......您还需要进行一些调试,添加一些中断点并查看正在按预期设置的值以及哪些值不是 – musefan

+0

http://support.microsoft.com/kb/812425 –

回答

5

得到它..

这地方

if (printDialog.ShowDialog() == DialogResult.OK) 
{ 
    StringReader reader = new StringReader(eintragRichTextBox.Text); 
    documentToPrint.Print(); 
    documentToPrint.PrintPage += new PrintPageEventHandler(DocumentToPrint_PrintPage); 
} 

我改成:

if (printDialog.ShowDialog() == DialogResult.OK) 
{ 
    StringReader reader = new StringReader(eintragRichTextBox.Text); 
    documentToPrint.PrintPage += new PrintPageEventHandler(DocumentToPrint_PrintPage); 
    documentToPrint.Print();  
} 

现在它工作正常..

此外,如果有人需要打印RichTextBox的内容,你可以使用我的代码..

+0

这将不会打印具有样式的文档,并且需要很长时间才能打印长文本! –

+0

4年前我写了这段代码,那时候的目标并不是打印它的风格。无论如何感谢提供了一个新的变种的答案。 – eMi

0

看来你的代码有问题,它只重印第一页,因为

StringReader reader = new StringReader(eintragRichTextBox.Text); 

DocumentToPrint_PrintPage()

0

使用!

StringReader reader; 
     int prov = 0; 

     private void DocumentToPrint_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) 
     { 


      if (prov == 0) 
      { 
       prov = 1; 
       reader = new StringReader(eintragRichTextBox.Text); 
      } 
float LinesPerPage = 0; 
      float YPosition = 0; 
      int Count = 0; 
      float LeftMargin = e.MarginBounds.Left; 
      float TopMargin = e.MarginBounds.Top; 
      string Line = null; 

....

5

我试图How to print the content of a RichTextBox control,它就像一个魅力。

你只需要创建一个自定义RichTextBox然后它将打印整个文本这么快,并保持在纸上的风格!

代码创建自定义RichTextBox

using System; 
using System.Windows.Forms; 
using System.Drawing; 
using System.Runtime.InteropServices; 
using System.Drawing.Printing; 

namespace RichTextBoxPrintCtrl 
{ 
    public class RichTextBoxPrintCtrl:RichTextBox 
    { 
     //Convert the unit used by the .NET framework (1/100 inch) 
     //and the unit used by Win32 API calls (twips 1/1440 inch) 
     private const double anInch = 14.4; 

     [StructLayout(LayoutKind.Sequential)] 
      private struct RECT 
     { 
      public int Left; 
      public int Top; 
      public int Right; 
      public int Bottom; 
     } 

     [StructLayout(LayoutKind.Sequential)] 
      private struct CHARRANGE 
     { 
      public int cpMin;   //First character of range (0 for start of doc) 
      public int cpMax;   //Last character of range (-1 for end of doc) 
     } 

     [StructLayout(LayoutKind.Sequential)] 
      private struct FORMATRANGE 
     { 
      public IntPtr hdc;    //Actual DC to draw on 
      public IntPtr hdcTarget;  //Target DC for determining text formatting 
      public RECT rc;    //Region of the DC to draw to (in twips) 
      public RECT rcPage;   //Region of the whole DC (page size) (in twips) 
      public CHARRANGE chrg;   //Range of text to draw (see earlier declaration) 
     } 

     private const int WM_USER = 0x0400; 
     private const int EM_FORMATRANGE = WM_USER + 57; 

     [DllImport("USER32.dll")] 
     private static extern IntPtr SendMessage (IntPtr hWnd , int msg , IntPtr wp, IntPtr lp); 

     // Render the contents of the RichTextBox for printing 
     // Return the last character printed + 1 (printing start from this point for next page) 
     public int Print(int charFrom, int charTo,PrintPageEventArgs e) 
     { 
      //Calculate the area to render and print 
      RECT rectToPrint; 
      rectToPrint.Top = (int)(e.MarginBounds.Top * anInch); 
      rectToPrint.Bottom = (int)(e.MarginBounds.Bottom * anInch); 
      rectToPrint.Left = (int)(e.MarginBounds.Left * anInch); 
      rectToPrint.Right = (int)(e.MarginBounds.Right * anInch); 

      //Calculate the size of the page 
      RECT rectPage; 
      rectPage.Top = (int)(e.PageBounds.Top * anInch); 
      rectPage.Bottom = (int)(e.PageBounds.Bottom * anInch); 
      rectPage.Left = (int)(e.PageBounds.Left * anInch); 
      rectPage.Right = (int)(e.PageBounds.Right * anInch); 

      IntPtr hdc = e.Graphics.GetHdc(); 

      FORMATRANGE fmtRange; 
      fmtRange.chrg.cpMax = charTo;    //Indicate character from to character to 
      fmtRange.chrg.cpMin = charFrom; 
      fmtRange.hdc = hdc;     //Use the same DC for measuring and rendering 
      fmtRange.hdcTarget = hdc;    //Point at printer hDC 
      fmtRange.rc = rectToPrint;    //Indicate the area on page to print 
      fmtRange.rcPage = rectPage;   //Indicate size of page 

      IntPtr res = IntPtr.Zero; 

      IntPtr wparam = IntPtr.Zero; 
      wparam = new IntPtr(1); 

      //Get the pointer to the FORMATRANGE structure in memory 
      IntPtr lparam= IntPtr.Zero; 
      lparam = Marshal.AllocCoTaskMem(Marshal.SizeOf(fmtRange)); 
      Marshal.StructureToPtr(fmtRange, lparam, false); 

      //Send the rendered data for printing 
      res = SendMessage(Handle, EM_FORMATRANGE, wparam, lparam); 

      //Free the block of memory allocated 
      Marshal.FreeCoTaskMem(lparam); 

      //Release the device context handle obtained by a previous call 
      e.Graphics.ReleaseHdc(hdc); 

      //Return last + 1 character printer 
      return res.ToInt32(); 
     } 

    } 
} 

主要来源包括PrintDialog, PrintPreviewDialog, PrintDocument, and PageSetupDialog,但它工作正常只是一个PrintDocument控制。所以我删除了一些额外的代码,以缩短有用的部分。但是如果你有兴趣使用它们,你可以在链接页面找到完整的代码。

private PrintDocument _printDocument = new PrintDocument(); 
    private int _checkPrint; 
    public Form1() 
    { 
     InitializeComponent(); 
     _printDocument.BeginPrint += _printDocument_BeginPrint; 
     _printDocument.PrintPage += _printDocument_PrintPage; 
    } 

    private void btnPrint_Click(object sender, EventArgs e) 
    { 
     PrintDialog printDialog=new PrintDialog(); 
     if (printDialog.ShowDialog() == DialogResult.OK) 
      _printDocument.Print(); 
    } 

    private void _printDocument_PrintPage(object sender, PrintPageEventArgs e) 
    { 
     // Print the content of RichTextBox. Store the last character printed. 
     _checkPrint = rchEditor.Print(_checkPrint, rchEditor.TextLength, e); 

     // Check for more pages 
     e.HasMorePages = _checkPrint < rchEditor.TextLength; 
    } 

    private void _printDocument_BeginPrint(object sender, PrintEventArgs e) 
    { 
     _checkPrint = 0; 
    }