如何打印多行的文本框
编号:QA002026
建立日期: 1999年11月13日 最后修改日期:2001年3月8日
所属类别:
Ariel:
操作系统:WIN 98
工具:VB 6
问题:我用了一个允许多行的TEXTBOX,里面的文字每一行都很长,它可以自动换行。但当我用Printer.print将它的内容打印出来时,却无法自动换行,而是一行很长,自然,超出纸张宽度的部分就被“吃掉”了。请问,有什么方法将TEXTBOX中的文字按纸张宽度打印出来?就象是在NotePad中,虽然一行很长,但打印时肯定是自动分行了。多谢。
回答:
Printer.Print不会自动换行,而且当每次从新行打印时,都是从最左端开始,而我们通常希望左侧保留一些空白地方。下面的程序可以简单地介绍一下原理:
Private Sub Command1_Click()
Dim s As String, sLine As String
Printer.CurrentY = 150
s = Text1.Text
pos = InStr(s, vbCrLf)
Do While pos > 0
sLine = Left(s, pos - 1)
s = Mid(s, pos + 2)
PrintSingleLine Trim(sLine), 100, 50
pos = InStr(s, vbCrLf)
Loop
PrintSingleLine Trim(s), 100, 50
End Sub
分行有两种,一种是使用回车换行,另一种是一行太长了。上面这段程序就是按照回车换行把文字分成多个段。然后对每个段都调用PrintSingleLine进行打印。PrintSingleLine的第一个参数为文字,第二个参数为每行的左侧的坐标,第三个参数表示一行可以打印多少字符。该函数如下:
Sub PrintSingleLine(s As String, X As Long, n As Integer)
Dim nLines As Integer
nLines = Len(s) / n
If Len(s) > n * nLines Then nLines = nLines + 1
If Len(s) = 0 Then nLines = 1 ' 空行
For i = 0 To nLines - 1
Printer.CurrentX = X
Printer.Print Mid(s, i * n + 1, n)
Next
End Sub
在这里,我们计算一段文字可以打印多少行,然后用程序分行打印。
当然,我们这里的函数比较简单,只能用于全部是汉字或全部是英文的情况,如果是中英文混排的情况。这主要是因为VB的Len和Mid函数造成(参考QA001041 "如何统计中英文混排情形的字符数"和QA000051 "VB 5提示错误:"输入超出文件尾"")。我们假设字体都是等宽的,如果是非等宽的,应该使用TextWidth函数计算字符的实际宽度。你可以进一步完善这些方面。
另外,可以参考微软的Knowledge Base的文章:“Q140886 OWTO: Print Multiline Text Box Using Windows API Functions”。
此问题由James Wayne回答。
| |
|
|
| |
|
|