热情软件屋

 

如何打印多行的文本框


编号: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回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio