首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

再提打印有关问题

2012-02-01 
再提打印问题本人想通过创建RichTextBoxPrintCtrl控件中所输入的值来打印,现在只能打印一个RichTextBoxPri

再提打印问题
本人想通过创建   RichTextBoxPrintCtrl   控件中所输入的值来打印,现在只能打印一个RichTextBoxPrintCtrl   控件中所输入的值,如果我想打印5个chTextBoxPrintCtrl   中值该如何实现


创建   RichTextBoxPrintCtrl   控件
-----------------------------------
新建一个名为   RichTextBoxPrintCtrl   的类库项目,代码如下:
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();
}

}
}

----------------------------

创建一个新的   Windows   应用程序项目;代码如下:
using   System;
using   System.Collections.Generic;
using   System.ComponentModel;
using   System.Data;
using   System.Drawing;
using   System.Text;
using   System.Windows.Forms;
using   System.Drawing.Printing;
using   System.IO;
namespace   print
{
        public   partial   class   Form1   :   Form
        {
                private   int   checkPrint1;


                private   int   checkPrint2;
                private   int   checkPrint3;
                private   int   checkPrint4;
                private   int   checkPrint5;

                public   Form1()
                {
                        InitializeComponent();
                        this.printDocument1.BeginPrint   +=   new   System.Drawing.Printing.PrintEventHandler(this.printDocument1_BeginPrint);
                        this.printDocument1.PrintPage   +=   new   System.Drawing.Printing.PrintPageEventHandler(this.printDocument1_PrintPage);
                        this.btnPrint.Click   +=   new   System.EventHandler(this.btnPrint_Click);
                        this.btnPrintPreview.Click   +=   new   System.EventHandler(this.btnPrintPreview_Click);
                        this.btnPageSetup.Click   +=   new   System.EventHandler(this.btnPageSetup_Click);
                   
                     
                }

                private   void   btnPageSetup_Click(object   sender,   EventArgs   e)
                {
                        pageSetupDialog1.ShowDialog   ();

                }

                private   void   btnPrintPreview_Click(object   sender,   EventArgs   e)
                {
                        printPreviewDialog1.ShowDialog();

                }

                private   void   btnPrint_Click(object   sender,   EventArgs   e)
                {
                        if   (printDialog1.ShowDialog()   ==   DialogResult.OK)
                                printDocument1.Print();

                }
                private   void   printDocument1_BeginPrint(object   sender,   System.Drawing.Printing.PrintEventArgs   e)
                {
                        checkPrint1   =   0;
                        checkPrint2   =   0;


                        checkPrint3   =   0;
                        checkPrint4   =   0;
                        checkPrint5   =   0;

                }

                private   void   printDocument1_PrintPage(object   sender,   System.Drawing.Printing.PrintPageEventArgs   e)
                {
                        //   Print   the   content   of   RichTextBox.   Store   the   last   character   printed.
                        checkPrint1   =   richTextBoxPrintCtrl1.Print(checkPrint1,   richTextBoxPrintCtrl1.TextLength,   e);
                                    //   Check   for   more   pages
                        if   (checkPrint1   <   richTextBoxPrintCtrl1.TextLength   )
                                e.HasMorePages   =   true;
                        else
                                e.HasMorePages   =   false;
                                   
                }
           
        }
}

[解决办法]
报表打印控件wsReport4.6

热点排行