RichTextBox内容写到Graphics

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();         }
        // Render the contents of the RichTextBox for printing         // Return the last character printed + 1 (printing start from this point for next page)         public int PrintToGraphics(int charFrom, int charTo, Rectangle MarginBounds,Rectangle PageBounds,Graphics g)         {             //Calculate the area to render and print             RECT rectToPrint;             rectToPrint.Top = (int)(MarginBounds.Top * anInch);             rectToPrint.Bottom = (int)(MarginBounds.Bottom * anInch);             rectToPrint.Left = (int)(MarginBounds.Left * anInch);             rectToPrint.Right = (int)(MarginBounds.Right * anInch);
            //Calculate the size of the page             RECT rectPage;             rectPage.Top = (int)(PageBounds.Top * anInch);             rectPage.Bottom = (int)(PageBounds.Bottom * anInch);             rectPage.Left = (int)(PageBounds.Left * anInch);             rectPage.Right = (int)(PageBounds.Right * anInch);
            IntPtr hdc = g.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             g.ReleaseHdc(hdc);
            //Return last + 1 character printer             return res.ToInt32();         }     } }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值