通过直接写串口来控制打印机时,如何控制打印字体的大小?希望有一小段源码解释。在线等待。(100分)

  • 主题发起人 疯语者
  • 开始时间

疯语者

Unregistered / Unconfirmed
GUEST, unregistred user!
我用的是EPSON TM88III 型热敏打印机现在不用驱动程序直接写串口控制打印。
但我不知道能打印多少种大小的字体,也不知道如何控制字体大小、控制换行、控制空行切纸等希望高手指点,很急,在线等待。
 
去 epson.com网站 下载一个此打印机的控制指令 好好研究
 
来不及了,我需要马上解决问题。
请指点。
 
http://lib.cqu.edu.cn/pcbook/FILES/PRO-DEPHI-EXPLOIN.htm
你可参考一下第8章中的介绍的
 
哪位大侠能直接给我一小段代码,让我一看就解决问题吗?
我知道其实这是个很简单的问题,只是我不知道到打印机的控制码同时也不知道怎么用。
 
你看一看打印机的说明书把,上面都有,如果你只打印字符
用ESC码控制就成了,如果你要打印图形就有点麻烦了,你要
写很多代码(包括计算机内的字体,也是图型的)
 
这有一段代码,你自己看吧,但愿能对你有所帮助:
//PrintDataList按照格式操纵小打印机打印数据单
//微型打印机为新容打公司产的MP宽幅打印机,以16*16点阵打印汉字,每行打印15个汉字
//上位程序调用PrintDataList,按要求填写参数即可实现打印
unit LittlePointerControl;
interface
type AxisData=array[1..5,1..4] of string;
//定义每轴数据数组类型
type PointAxisData=^AxisData;
//指向轴数据数组的指针
procedure PrintDataList(ListTitle : string;ExamTime:string;CarNumber:string;CarSpeed:string;AxisItem : integer;Data : PointAxisData;AxisTotalExcess:string;
TotalWeigh:string;TotalExcess:string;ExcessDegree:string;PunishWay:string;PunishWage:string);
implementation
var
PrintPort:textfile;
//定义打印端口为全局变量
procedure ChangeLine(LineSum : integer);
//打印纸前进LineSum行
var
i:integer;
begin
for i:=1 to LineSumdo
write(PrintPort,#13);
write(PrintPort,#10);
end;

procedure ChangeChinese(Format:integer);
//打印机转为汉字格式,汉字打印格式由Format决定
begin
write(PrintPort,#27);
write(PrintPort,#56);
write(Printport,chr(Format));
end;

procedure InitialPrinter;
//打印机初始化
begin
write(PrintPort,#27);
Write(PrintPort,#64);
write(PrintPort,#28);
write(PrintPort,#87);
write(PrintPort,#1);
end;

procedure PrintSegFlag;
begin
Write(PrintPort,'------------------------');
end;
Procedure BackLine;
//换行
begin
write(PrintPort,#13);
end;

procedure SetBlank(StrPram:string;IntOtherCode:integer);
//根据参数计算打印空格数并打出StrPram是上及模块传递的参数,IntOtherCode是本行其他打印字符的打印长度
var
IntTempLength:integer;
i:integer;
begin
IntTempLength:=length(StrPram);
IntTempLength:=IntOtherCode-IntTempLength;
for i:=1 to IntTempLengthdo
Write(PrintPort,' ');
end;
procedure PrintLine(StrTitle:string;StrPram:string);
//打印一行,StrTitle为标题,StrPram为上位模块传来的参数加上尾标
var
i:integer;
begin
write(PrintPort,StrTitle);
i:=24-Length(StrTitle);
SetBlank(StrPram,i);
write(PrintPort,StrPram);
end;

procedure PrintDataList(ListTitle : string;ExamTime : string;CarNumber:string;CarSpeed:string;AxisItem : integer;Data : PointAxisData;AxisTotalExcess:string;
TotalWeigh:string;TotalExcess:string;ExcessDegree:string;PunishWay:string;PunishWage:string);
var
i,j,w,IntTemp:integer;
StrTemp:string;
StrChineseNumber:array[1..5] of string;
//装入汉字数字
begin
StrChineseNumber[1]:='一';
StrChineseNumber[2]:='二';
StrChineseNumber[3]:='三';
StrChineseNumber[4]:='四';
StrChineseNumber[5]:='五';
assignfile(PrintPort,'LPT1');
rewrite(PrintPort);
//初始化
InitialPrinter;
ChangeLine(3);
ChangeChinese(0);
write(PrintPort,' k m');
BackLine;
write(PrintPort,'检测路线 线');
BackLine;
write(PrintPort,'检测单位');
BackLine;
write(PrintPort,'检测员签字');
BackLine;
write(PrintPort,'当事人签字');
BackLine;
PrintSegFlag;
write(PrintPort,'处罚金额');
SetBlank(PunishWage,13);
write(PrintPort,PunishWage+' 元');
write(PrintPort,'处罚方式');
SetBlank(PunishWay,16);
Write(PrintPort,PunishWay);

write(PrintPort,'超载程度');
SetBlank(ExcessDegree,16);
write(PrintPort,ExcessDegree);
PrintSegFlag;
PrintLine('总重超限',TotalExcess+' kg');
PrintLine('货车总重',TotalWeigh+' kg');
PrintLine('轴载总超限',AxisTotalExcess+' kg');
PrintSegFlag;
if (AxisItem>5) or (AxisItem<1)
then
begin
Write(PrintPort,'Axis Data Empty or Error');
BackLine;
PrintSegFlag;
end
else
begin
{for i:=1 to AxisItemdo
begin
j:=AxisItem+1-i;
PrintLine('轴 超限',Data^[j,3]+' kg');
PrintLine(StrChineseNumber[j]+' '+'荷载',Data[j,2]+' kg');
PrintLine('第 轴型', Data^[j,1]);
PrintSegFlag;
end;
}
for i:=1 to AxisItemdo
begin
IntTemp:=0;
for j:=1 to 4do
begin
for w:=1 to (j-1)*6-IntTempdo
//打印空格
write(PrintPort,' ');
write(PrintPort,Data^[AxisItem+1-i,j]);
IntTemp:=(j-1)*6+length(Data^[AxisItem+1-i,j]);
end;
if IntTemp<>24 then
BackLine;
end;
write(PrintPort,'轴轮 轴重 限载 超限');
BackLine;
PrintSegFlag;
end;
PrintLine('车速',CarSpeed+' km/h');
PrintLine('车牌号',CarNumber);
StrTemp:='';
for i:=15 to 26do
//打印时间
StrTemp:=StrTemp+ExamTime;
SetBlank(StrTemp,24);
write(PrintPort,StrTemp);
StrTemp:='';
//打印日期
for i:=1 to 14do
StrTemp:=StrTemp+ExamTime;
PrintLine('检测时间',StrTemp);
PrintSegFlag;
i:=Length(ListTitle);
StrTemp:='';
if i>24 then
begin
for i:=25 to Length(ListTitle)do
StrTemp:=StrTemp+ListTitle;
write(PrintPort,StrTemp);
BackLine;
StrTemp:='';
for i:=1 to 24do

StrTemp:=StrTemp+ListTitle;
Write(PrintPort,StrTemp);
end
else
write(PrintPort,ListTitle);

ChangeLine(5);
closefile(PrintPort);
end;
 
如何使字体放大一倍?
是哪个控制命令?
 
每一个的打印机的指令应该是不同的。
 
我给你一段代码,是我开发POS是的程序。
弹开钱箱
function TFixtureControl.FlickCashBox():Boolean;
var
MYFile:TextFile;
begin
try
Assignfile(MyFile,'lpt1');
Rewrite(MyFile);
Writeln(MyFile,#$1b#$70#$00#$32#$c8);
System.CloseFile(MyFile);
Result:=true;
except
Result:=false;
end;
end;
 
如何在WINDOWS中控制打印字体的长宽,而不受限于SIZE 的限制

首先为了达到这个功能,可以采用Windows的逻辑字体(LogFont)
可以使用 CreateFont 或 CreateFontIndirect 这两个Windows API
函数来定义任何想要的字体,由于 CreateFont 所需的参数甚多通常
我们使用 CreateFontIndirect 来建立所需的逻辑字体,这个API函数
在Delphi中的声明为
function CreateFontIndirect(const p1: TLogFont): HFONT;
stdcall;
其中只有一个参数 p1: TLogfont
所有有关字体的参数完全通过这个
TLogfont结构来传送,Windows将根据结构中的内容创建出相应的逻辑
字体,在Delphi的Windows.pas中TLogFont是这样定义的

TLogFontA = packed record
lfHeight: Longint;
lfWidth: Longint;
lfEscapement: Longint;
lfOrientation: Longint;
lfWeight: Longint;
lfItalic: Byte;
lfUnderline: Byte;
lfStrikeOut: Byte;
lfCharSet: Byte;
lfOutPrecision: Byte;
lfClipPrecision: Byte;
lfQuality: Byte;
lfPitchAndFamily: Byte;
lfFaceName: array[0..LF_FACESIZE - 1] of AnsiChar;
end;

TLogFontW = packed record
lfHeight: Longint;
lfWidth: Longint;
lfEscapement: Longint;
lfOrientation: Longint;
lfWeight: Longint;
lfItalic: Byte;
lfUnderline: Byte;
lfStrikeOut: Byte;
lfCharSet: Byte;
lfOutPrecision: Byte;
lfClipPrecision: Byte;
lfQuality: Byte;
lfPitchAndFamily: Byte;
lfFaceName: array[0..LF_FACESIZE - 1] of WideChar;
end;

TLogFont = TLogFontA;

其中涉及到很多参数,其中

lfHeight: Longint;
指定以逻辑单位标定的字体高度,取值可为正负或零,对于需要随意
定义字体高度的情况下通常取负值,以保证获得实际尺寸的字体。

lfWidth: Longint;
用于指定字体的平均宽度,由于Windows系统下的大多数字体都是比例
字体因而采用平均宽度这个表示方法。若指定为0,则系统会自动根据
适当的比例自动处理宽度。

lfEscapement: Longint;
指定输出方向与当前坐标系X轴之间的以十分之一度为单位的角度。

lfOrientation: Longint;
指定每个字符与当前坐标系X轴之间的以十分之一度为单位的角度。在
Windows95中这个值等同于lfEscpement。

lfWeight: Longint;
指定范围为从0至1000的字体加重程度,400是标准字体700为加重字体,
0表示采用默认值。

lfItalic: Byte;
不为0表示采用斜体字。

lfUnderline: Byte;
不为0表示带下划线。

lfStrikeOut: Byte;
不为0表示带穿透线。

lfCharSet: Byte;
指定字体集。

lfOutPrecision: Byte;
指定输出精度。用于确定对前面一些设定值的精确程度。

lfClipPrecision: Byte;
指定裁剪精度。裁剪是Windows图形环境下的一种特殊处理,简单说就是
去掉图形中落在视图以外的部分,有助于提高图形的处理速度。

lfQuality: Byte;
指定输出质量。

lfPitchAndFamily: Byte;
指定字体的Pitch和Family。

lfFaceName: array[0..LF_FACESIZE - 1] of AnsiChar;
指定采用的字体名称。

在建立逻辑字体时,我们通常使用

lfHeight和lfWidth来确定字体的尺寸,使用lfEscapement和lfOrientation
来确定字体的输出方向,使用lfWeight
lfItalic
lfUnderline

lfStrikeOut
来确定字体的加重,斜体,下划线和穿透线,使用lfCharSet
来确定字体的字符集,通常采用系统默认的字符集。
对于lfOutPrecision
lfClipPrecision
lfQuality一般应用于对屏幕之外
的输出设备,通常采用默认值。采用lfPitchAndFamily来确定采用定宽或可
变字体和字体的家族。以lfFaceName来通过名称选择采用的字体。
另外应当注意在Windows环境下,每种字体具体输出为何种形式取决于很多
因素,需要对以上这些参数进行有效的组合才能达到所要的效果。
 
TM88II和TM88III不是用Windows字体的方法可以解决的。
打印机的驱动带了两种内置打印字体,可以快速打印汉字。
宋体 7.5cpi和宋体 3.8cpi。
字体大小为10和19两种。
 

Similar threads

D
回复
0
查看
941
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部