积极答复者
如何打印丰富的格式化文本内容

问题
-
PrintPage 处理打印事件,的一般性程序如下。
''' <summary>
''' PrintPage 是打印事件。对于要打印的每一页
''' 都会激发此事件。也可以处理 BeginPrint 和
''' EndPrint 事件以获得更多的控制。
''' 下面的代码
''' 对纯文本的执行速度很快且很有用,
''' 因为 MeasureString 计算可以适合整页的文本。但是,对于
''' 格式化文本则不那么有用。如果是格式化文本,则需要具有更加复杂的
''' 字级别(相对于页级别)控件。
''' </summary>
Private Sub pdoc_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Dim txtDocument = RichTextBox1 '声明要打印的文档内容
' 声明一个变量来保存最后一个打印字符的位置。声明为
' 静态以便后面的 PrintPage 事件可以引用该变量。Static intCurrentChar As Int32
' 初始化要用于打印的字体。
Dim font As New System.Drawing.Font("宋体", 10.5!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(134, Byte))Dim intPrintAreaHeight, intPrintAreaWidth, marginLeft, marginTop As Int32
With PrintDocument1.DefaultPageSettings
' 初始化包含打印区域矩形的
' 边界的局部变量。
intPrintAreaHeight = .PaperSize.Height - .Margins.Top - .Margins.Bottom
intPrintAreaWidth = .PaperSize.Width - .Margins.Left - .Margins.Right' 初始化局部变量以保存将用作打印区域
' 矩形左上角的 X 和 Y 坐标
' 的边距值。
marginLeft = .Margins.Left ' X 坐标
marginTop = .Margins.Top ' Y 坐标
End With' 如果用户选择了“横向”模式,则交换打印区域的高度与
' 宽度。
If PrintDocument1.DefaultPageSettings.Landscape Then
Dim intTemp As Int32
intTemp = intPrintAreaHeight
intPrintAreaHeight = intPrintAreaWidth
intPrintAreaWidth = intTemp
End If' 根据打印区域的高度和字体的
' 高度计算文档中的总行数。
Dim intLineCount As Int32 = CInt(intPrintAreaHeight / font.Height)
' 初始化定义打印区域的矩形结构。
Dim rectPrintingArea As New RectangleF(marginLeft, marginTop, intPrintAreaWidth, intPrintAreaHeight)' 将 StringFormat 类实例化,该类封装文本布局
' 信息(如对齐方式和行距),显示操作
' (如省略号插入和区域数字替换)和 OpenType
' 功能。使用 StringFormat 可使
' MeasureString 和 DrawString 在打印每页时仅使用整数行,
' 而忽略非完整行。如果每页的打印区域高度不能整除每页的行数(通常都会如此),
' 非完整行在其他情况下可能会打印。
' 请参见 SDK 文档中有关 StringFormatFlags 的进一步讨论。
Dim fmt As New StringFormat(StringFormatFlags.LineLimit)
' 调用 MeasureString 确定适合打印区域矩形
' 的字符数。向 CharFitted Int32 传递 ByRef,并在稍后用于
' 计算 intCurrentChar,进而计算 HasMorePages。LinesFilled
' 对于本示例不是必要的,但必须在传递 CharsFitted 时进行传递。
' Mid 用于传递从打印的上一页断开的
' 剩余文本段(回想一下,intCurrentChar 是声明为
' 静态的)。
Dim intLinesFilled, intCharsFitted As Int32
e.Graphics.MeasureString(Mid(txtDocument.Text, intCurrentChar + 1), font, _
New SizeF(intPrintAreaWidth, intPrintAreaHeight), fmt, _
intCharsFitted, intLinesFilled)' 将文本打印到页。
e.Graphics.DrawString(Mid(txtDocument.Text, intCurrentChar + 1), font, _
Brushes.Black, rectPrintingArea, fmt)' 使当前字符前进到在此页上打印的最后一个字符。因为
' intCurrentChar 是静态变量,所以它的值可以用于
' 要打印的下一页。使它前进 1 个字符并将其传递到 Mid()
' 以打印下一页(请参见上面 MeasureString())。
intCurrentChar += intCharsFitted' HasMorePages 通知打印模块是否应激发
' 另一个 PrintPage 事件。
If intCurrentChar < txtDocument.Text.Length Then
e.HasMorePages = True
Else
e.HasMorePages = False
' 因为 intCurrentChar 是静态的,所以必须显式重置它。
intCurrentChar = 0
End If
End Sub-------------------
如果我想打印丰富的格式化文本内容,比如让RichTextBox1读取一个RTF文件内容,里面有字体的设置,段落设置,换页符等。
那么打印事件该如何做?希望能给出示例代码。
答案
-
HOW TO:使用 Microsoft Visual Basic .NET 打印 RichTextBox 的内容
http://support.microsoft.com/kb/811401/zh-cnhttp://support.microsoft.com/kb/812425/zh-cn
恩 终于整明白了 需要调用W32API
- 已标记为答案 zhanglinfeng 2010年11月30日 12:48
全部回复
-
HOW TO:使用 Microsoft Visual Basic .NET 打印 RichTextBox 的内容
http://support.microsoft.com/kb/811401/zh-cnhttp://support.microsoft.com/kb/812425/zh-cn
恩 终于整明白了 需要调用W32API
- 已标记为答案 zhanglinfeng 2010年11月30日 12:48