如何实现?不使用richtextbox的扩展那个方法....好像有人说可以调用写字板程序?
还是word程序?高人快来啊......

解决方案 »

  1.   

    不使用richtextbox的扩展那个方法
    -------------
    楼主说的是那个使用RichTextBox类的方法吗?richtextbox类就是.net框架中的类了,使用这个类来打印我觉得是最合适的了。
      

  2.   

    我是参考微软提供的代码来做的,不知道楼主说的是不是这个,我觉得是非常不错的: public class PrintableCtrl : 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();
    }
    }
      

  3.   

    我现在是在想,把richTextBox中的内容,创建一个默认的WORD文档,然后能不能在WINFORM中调用WORD的打印,,打印完了之后再删掉这个建立的WORD文档,,好像有点异想天开了..呵呵..高手快来批评吧..
      

  4.   

    可以写到word文档中打印再删除掉word文档,不过还不如用RichTextBox类呢