本人想通过创建 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;
}
}
}
-----------------------------------
新建一个名为 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;
}
}
}
解决方案 »
- 分享实用代码段,顺便过年散分(1)
- 如何让RSA加密相同的文本,密文每次不一样?
- winform如何向指定的外網IP發送文件?求高手啊
- 急···如何使用messagebox实现删除操作
- datalist中 GridLines="Both" 显示有问题
- 找不到文件“Microsoft.Windows.CommonLanguageRuntime, Version=2.0.50727.0”。
- 未将对象引用设置到对象的实例,求救啊。。急死了!!
- thoughtwork公司参加笔试 没有通过 把题给大家看看
- 在C#写的服务程序中,Timer控件不能被触发。怎么回事啊?
- 怎样对DataSet中的数据进行导航?
- 怪事,急,在线等,大家帮帮我!!!!!!!!!!!!!!!!
- vs2005怎么找不到重写、重载之类的属性了呢?
请问用visual c#2005如何实现,请大家帮忙,先谢了
Private Sub DataReport_Initialize()
Dim AdoCon As New ADODB.Connection
Dim AdoRec As New ADODB.Recordset
Dim ctl As Object
AdoCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\人员名单.xls;Extended Properties=""Excel 8.0;HDR=YES;IMEX=1"""
AdoRec.Open "select aa,ss,dd,ff,gg,hh,jj,kk from [Sheet1$]", AdoCon, adOpenDynamic, adLockReadOnly With Me
Set .DataSource = AdoRec
For Each ctl In .Sections.Item("Section1").Controls
If TypeName(ctl) = "RptTextBox" Then
Select Case ctl.Name
Case "Text1"
ctl.DataField = AdoRec.Fields("aa").Name
Case "Text2"
ctl.DataField = AdoRec.Fields("ss").Name
Case "Text3"
ctl.DataField = AdoRec.Fields("dd").Name
Case "Text4"
ctl.DataField = AdoRec.Fields("ff").Name
Case "Text5"
ctl.DataField = AdoRec.Fields("gg").Name
Case "Text6"
ctl.DataField = AdoRec.Fields("hh").Name
Case "Text7"
ctl.DataField = AdoRec.Fields("jj").Name
Case "Text8"
ctl.DataField = AdoRec.Fields("kk").Name
End Select
End If
Next
End WithEnd Sub