现在的位置: 首页 > 综合 > 正文

RichTextBox打印和打印成图片

2013年10月13日 ⁄ 综合 ⁄ 共 6649字 ⁄ 字号 评论关闭

这里类把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;             
                                
        }
          
    

  
    }
}

抱歉!评论已关闭.