这里类把RICHTEXTBOX的内容打印到DOCUMENT里
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Printing;
using System.Runtime.InteropServices;
namespace WindowsApplication3.ControlPrint.PrintClass
{
public class MyRichTextBox
{
/* 使用方式
ControlPrint.PrintClass.MyRichTextBox MyText= new WindowsApplication3.ControlPrint.PrintClass.MyRichTextBox(richTextBox1);
ControlPrint.PrintClass.PrintControllerFile PrintControll = new WindowsApplication3.ControlPrint.PrintClass.PrintControllerFile();
MyText.Document.DefaultPageSettings.Margins.Bottom = 0;
MyText.Document.DefaultPageSettings.Margins.Left = 0;
MyText.Document.DefaultPageSettings.Margins.Right = 0;
MyText.Document.DefaultPageSettings.Margins.Top = 0; //设置边局
MyText.Document.PrintController = PrintControll;
MyText.Document.Print();
for (int i = 0; i != PrintControll.Image.Count; i++)
{
PrintControll.Image[i].Save(@"C:/" + i.ToString() + ".emf");
}
*/
private int checkPrint = 0;
private RichTextBoxPrintCtrl _RichTextBox;
private PrintDocument _PrintDocument = new PrintDocument();
public PrintDocument Document { get { return _PrintDocument; } }
public MyRichTextBox(RichTextBox MyRichTextBox)
{
_RichTextBox = new RichTextBoxPrintCtrl();
_RichTextBox.Rtf = MyRichTextBox.Rtf;
_PrintDocument.BeginPrint += new PrintEventHandler(_PrintDocument_BeginPrint);
_PrintDocument.PrintPage += new PrintPageEventHandler(_PrintDocument_PrintPage);
}
void _PrintDocument_PrintPage(object sender, PrintPageEventArgs e)
{
checkPrint = _RichTextBox.Print(checkPrint, _RichTextBox.TextLength, e);
if (checkPrint < _RichTextBox.TextLength)
e.HasMorePages = true;
else
e.HasMorePages = false;
}
void _PrintDocument_BeginPrint(object sender, PrintEventArgs e)
{
checkPrint = 0;
}
private 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);
/// <summary>
///
/// </summary>
/// <param name="charFrom">页号</param>
/// <param name="charTo">文字长度</param>
/// <param name="e">打印</param>
/// <returns></returns>
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();
}
}
}
}
下面的内把PRINTDOCUMENT里的图形
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Printing;
using System.Collections.Generic;
using System.Diagnostics;
namespace WindowsApplication3.ControlPrint.PrintClass
{
/// <summary>
/// 打印到图形类
/// </summary>
internal class PrintControllerFile : PreviewPrintController
{
private IList<Image> _Image = new List<Image>();
/// <summary>
/// 获取打印的图形
/// </summary>
public IList<Image> Image { get {return _Image; } }
public override void OnEndPage(PrintDocument document, PrintPageEventArgs e)
{
base.OnEndPage(document, e);
PreviewPageInfo[] PageInfos = GetPreviewPageInfo();
PreviewPageInfo PageInfo = PageInfos[PageInfos.Length - 1];
_Image.Add(PageInfo.Image);
//_Metafile = (Metafile)MyImage;
}
}
}