【问题标题】:How to print .rtf file?如何打印 .rtf 文件?
【发布时间】:2010-10-01 11:12:31
【问题描述】:

如何使用 C# 打印 .rtf 文件? (WinForms/WPF 应用程序)

【问题讨论】:

    标签: c# .net winforms printing rtf


    【解决方案1】:

    来自https://support.microsoft.com/en-us/kb/812425

    在 Visual C# .NET 或 Visual C# 2005 中,创建一个名为 RichTextBoxPrintCtrl 的新类库项目。默认情况下,创建 Class1.cs。 将 Class1.cs 的名称更改为 RichTextBoxPrintCtrl.cs。 在解决方案资源管理器中,右键单击引用,然后单击添加引用。 在“添加引用”对话框中,双击 System.Drawing.dll 和 System.Windows.Forms.dll,然后单击“确定”。

    将 RichTextBoxPrintCtrl.cs 中的现有代码替换为以下代码:

    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();
            }
    
        }
    }
    

    在“调试”菜单上,单击“开始”以运行应用程序。显示表格 1。 在 RichTextBoxPrintCtrl 中键入一些文本。 单击页面设置以设置页面设​​置。 单击打印预览以查看页面的打印预览。 点击打印,打印 RichTextBoxPrintCtrl 的内容。

    【讨论】:

      【解决方案2】:

      Printing Word(RTF) Documents in C#

      或者,您可以在 RichTextBox 控件中打开文件,然后从那里send to printing

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 2010-10-14
      相关资源
      最近更新 更多