最近,笔者编制出一套综合试题库管理系统,完成试题的我、自动组卷及打印试卷等工作,在编程时,也碰到了打印问题,笔者找到了几种打印方法,现将它们整理出来,以飧读者,希望能给您的工作提供一点方便。
一、采用Visual Basic提供简单的打印函数PrintForm方法
应用程序窗体的PrintForm方法时,Visual Basic把窗体的位图送到当前打印机。该方法的优点在于它几乎不需要任何编程,但也有很大缺陷。最为突出的是当低分辨率图形在高分辨率打印机上打印时,其结果令人无法满意,会产生锯齿。下面代码将在打印机上打印窗体。
Private Sub Command1_Click() '用PrintForm打印
Me.PrintForm '打印窗体的可见区域
End Sub
二、用Printer对象
用Printer对象可以进行高分辨率输出,但要想产生复杂的打印输出,编程较为繁琐。Printer对象代表系统确省的打印机。Printer对象支持许多由窗体和图形框所支持的属性和方法,三种对象都有画线和画方框。应用程序可用以下列代码在Printer对象上画出一平方英寸的方框。它离左上角二英寸。注意:打印机以twips来测量距离。每英寸有1440个twips。
Printer.Line(2*1440,2*1440)-Step(1440,1440), ,B
打印机、从窗体和图形框都有Circle、PaintPicture、Print、Pset、TextHeight、TextWidth方法。使用这些方法,应用程序可以为打印机生成高分辨率输出。
打印文本直接用Print方法,见下列代码:
Printer.Print “Hello,China ComputerWorld!” ‘打印字符串
Printer对象还有一些窗体和图形框都没有方法:
·NewPage告诉打印机,程序对当前输出页的发送已经结束。Printer对象应开始新的一页。
·EndDoc告诉Visual Basic,程序创建文档结束。VISUAL BASIC应将它发送到物理打印机上打印。
·KillDoc取消当前打印作业。应用程序应该终止由EndDoc和KillDoc所设定的每个打印作业。
·Zoom属性用于定义打印输出的缩放因子。
·Copies属性用于定义打印的副本数目。
三、采用直接将数据传送打印机的方法进行打印输出
该方法也不太实用。有两种方法将数据送往打印机。第一种是用Print # 方法,就象将数据写入一个文件一样写数据。另一种方法写端口,但不是送文本,而是送特定的PCL语言,PCL表示打印控制语言(Print Control Language)。它是一种特殊语言,用转义代码来控制打印机的具体动作。因为此方法太繁琐,本文不做太多介绍,见谅
功能:打印一个字符入口参数:DX=数据寄存器端口地址
BL=超时参数
AL=打印字符的代码
AH=打印机状态
print proc
push dx
push ax
out dx,al
inc dx
wait:xor cx,cx ----->这里不明白查询参数怎么查询65536次的?
假设一致未就绪,第一次查询后,LOOP指令使CX减1,得FFFFH,不为0,继续循环,直到cx为1,共65536?
wait1:in al,dx
mov ah,al
test al,80h
jnz next不忙碌,则转
loop wait1 ----->为什么查询参数bl不先减1,就又开始读状态信息。
是不是要loop wait1和dec bl对调下呢?
试想,BL够减65536次吗?每查询65536次,减1
dec bl 超时参数减1
jnz wait
and ah,0f8h
or ah,1
jmp exit
next:inc dx
mov al,0dh
out dx,al
mov al,0ch
jmp $+2
out dx,al
and ah,0f8h ----->0f8h=1111 1000为什么要表示出错,联机,无纸,应答,不忙碌呢?
这是硬件定义的
exit:xor ah,48h ----->xor ah,48h和下面的都看不懂是什么意思了.
pop dx
mov al,dl
这三句,即保存ah,又保留AL的原有状态
pop dx
ret
print endp
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)