lazarus 显示(中文)点阵字符要带2个字体文件,想用res/lrs来摆脱hzk16.bin和asc16.bin,尝试用lazarus lrs/res资源文(读lrs部分得到“禁卫军”帮助),用以下方法都可以实现:
一、读取lrs资源文件
1、生成lrs文件:
将Hzk16.bin和asc16.bin生成font.lrs
一、读取lrs资源文件
1、生成lrs文件:
将Hzk16.bin和asc16.bin生成font.lrs
lazres.exe font.lrs Hzk16.bin asc16.bin
2、一定要在Initialization引用lrs资源:
Initialization {$I font.lrs} end.
3、引用方法:
procedure LoadFontResource; var LResource:TLResource; StringStream: TStringStream; begin LResource := LazarusResources.Find('hzk16');//查找lrs中的hzk16 if LResource <> nil then begin StringStream:=TStringStream.Create(LResource.Value);//找到后读取Hzk16 try Hzk16FontData:=TMemoryStream.Create; StringStream.Position:=0; StringStream.SaveToStream(hzk16FontData); finally StringStream.Free; end; end; LResource := LazarusResources.Find('ASC16'); if LResource <> nil then begin StringStream:=TStringStream.Create(LResource.Value); try ASC16FontData:=TMemoryStream.Create; StringStream.Position:=0; StringStream.SaveToStream(ASC16FontData); finally StringStream.Free; end; end; end;
lrs方式的完整代码:
unit DispDotMatrixCode; {$mode ObjFPC}{$H+} interface uses SysUtils,Classes,Graphics,ExtCtrls, LazUTF8,LConvEncoding,LResources; var Hzk16FontData: TMemoryStream; // 用于存储点阵字体数据 ASC16FontData: TMemoryStream; // 用于存储点阵字体数据 procedure DispDotMatrix(Images:TImage;str:string;TextColor:TColor;bs,Width,Height,wordGap:Integer); implementation procedure DispDotMatrix(Images:TImage;str:string;TextColor:TColor;bs,Width,Height,wordGap:Integer); var strChar: String; i, n: integer; Image: TImage; f,fasc: file; x1:Integer; procedure MakeChar(Image:TImage;HZ: String;Chinese:Boolean;xs,wordGap:Integer); var h:AnsiString; OffSet: integer; GetStr: array [0..31] of byte; temp,dis:byte; x, y, i, j: integer; Q, W,dz,wd: word; begin if Chinese then begin dz:=31; wd:=15; h:=UTF8ToCP936(HZ); Q := Byte(H[1]) - $A0; W := Byte(H[2]) - $A0; OffSet := (94*(Q-1)+(W-1))*32; Hzk16FontData.Position:=OffSet;//+$54; Hzk16FontData.Read(GetStr,32); end else begin dz:=15; wd:=7; W := Byte(Hz[1]); OffSet := W*16; ASC16FontData.Position:=OffSet;//+$54; ASC16FontData.Read(GetStr,16); end; x:=0; y:=0; i:=0; j:=0; while(i<=dz) do begin temp:=getstr[i]; for j:=0 to 7 do begin dis:=temp and 128; dis:=dis shr 7; if dis=1 then begin Image.Canvas.Rectangle(x1+(x+1)*xs-1,(y+1)*xs-1,x1+(x+1)*xs-1+xs,(y+1)*xs-1+xs); end; inc(x); if x>wd then begin x:=0; inc(y); end; temp:=temp shl 1; end; inc(i); end; if wordGap<0 then wordGap:=5; x1:=x1+wd+wd*(xs-1)+wordGap; end; begin x1:=0; bs:=bs*3; if bs<3 then bs:=3; Image:=TImage.Create(nil); Image.Width:=Width; Image.Height:=Height; Image.Canvas.Brush.Color := clBlack; Image.Canvas.FillRect(rect(0,0,Width,Height)); Image.Canvas.Brush.Color :=TextColor; Image.Canvas.Pen.Color := clBlack; if Length(str) > 0 then begin for i := 0 to utf8Length(str) - 1 do begin strChar := utf8Copy(str, i+1, 1); if ord(strChar[1])>127 then MakeChar(Image,strChar,true,bs,wordGap) else MakeChar(Image,strChar,false,bs,wordGap); end; Images.Picture.Assign(Image.Picture); end; FreeAndNil(image); end; procedure LoadFontResource; var LResource:TLResource; StringStream: TStringStream; begin LResource := LazarusResources.Find('hzk16'); if LResource <> nil then begin StringStream:=TStringStream.Create(LResource.Value); try Hzk16FontData:=TMemoryStream.Create; StringStream.Position:=0; StringStream.SaveToStream(hzk16FontData); finally StringStream.Free; end; end; LResource := LazarusResources.Find('ASC16'); if LResource <> nil then begin StringStream:=TStringStream.Create(LResource.Value); try ASC16FontData:=TMemoryStream.Create; StringStream.Position:=0; StringStream.SaveToStream(ASC16FontData); finally StringStream.Free; end; end; end; Initialization {$I font.lrs} LoadFontResource; finalization FreeAndNil(Hzk16FontData); FreeAndNil(asc16FontData); end.
二、读取res资源文件
1、生成Res文件:
1)编写rc文件:
ASC16 RCDATA "ASC16.bin"
Hzk16 RCDATA "Hzk16.bin"
2)、将rc文件编译为Res文件
I)用delphi的brcc32.exe:
brcc32 font.rc
II)用lazarus/fpc自带的fpcres.exe
-of res 指定生成为res格式
-o font.res 指定生成的文件名称
fpcres -of res -o font.res font.rc
注意:用第三方的工具(resource_hacker/ResEdit等)生成的res发现在lazarus存在兼容问题。
2、设置res资源(有2种方法):
1)Project-->Options-->Project Options-->Resources-->Add添加相应的文件
2)第2个方法,用代码添加指定资源文件:
implementation {$R *.lfm} {$R font.res}
3、代码部分:
procedure LoadFontResource; begin ResourceStream := TResourceStream.Create(HInstance, 'HZK16', RT_RCDATA);//从Res读取Hzk16字体 try Hzk16FontData:=TMemoryStream.Create; ResourceStream.Position:=0; ResourceStream.SaveToStream(hzk16FontData); finally ResourceStream.Free; end; ResourceStream := TResourceStream.Create(HInstance, 'ASC16', RT_RCDATA);//从Res读取ASC6字体 try ASC16FontData:=TMemoryStream.Create; ResourceStream.Position:=0; ResourceStream.SaveToStream(ASC16FontData); finally ResourceStream.Free; end; end;
4、Res方式的完整代码:
unit DispDotMatrixCode; {$mode ObjFPC}{$H+} interface uses LCLType,SysUtils,Classes,Graphics,ExtCtrls, LazUTF8,LConvEncoding,LResources; var Hzk16FontData: TMemoryStream; // 用于存储点阵字体数据 ASC16FontData: TMemoryStream; // 用于存储点阵字体数据 ResourceStream : TResourceStream; procedure DispDotMatrix(Images:TImage;str:string;TextColor:TColor;bs,Width,Height,wordGap:Integer); implementation {$R font.res} procedure DispDotMatrix(Images:TImage;str:string;TextColor:TColor;bs,Width,Height,wordGap:Integer); var strChar: String; i, n: integer; Image: TImage; f,fasc: file; x1:Integer; procedure MakeChar(Image:TImage;HZ: String;Chinese:Boolean;xs,wordGap:Integer); var h:AnsiString; OffSet: integer; GetStr: array [0..31] of byte; temp,dis:byte; x, y, i, j: integer; Q, W,dz,wd: word; begin if Chinese then begin dz:=31; wd:=15; h:=UTF8ToCP936(HZ); Q := Byte(H[1]) - $A0; W := Byte(H[2]) - $A0; OffSet := (94*(Q-1)+(W-1))*32; Hzk16FontData.Position:=OffSet;//+$54; Hzk16FontData.Read(GetStr,32); end else begin dz:=15; wd:=7; W := Byte(Hz[1]); OffSet := W*16; ASC16FontData.Position:=OffSet;//+$54; ASC16FontData.Read(GetStr,16); end; x:=0; y:=0; i:=0; j:=0; while(i<=dz) do begin temp:=getstr[i]; for j:=0 to 7 do begin dis:=temp and 128; dis:=dis shr 7; if dis=1 then begin Image.Canvas.Rectangle(x1+(x+1)*xs-1,(y+1)*xs-1,x1+(x+1)*xs-1+xs,(y+1)*xs-1+xs); end; inc(x); if x>wd then begin x:=0; inc(y); end; temp:=temp shl 1; end; inc(i); end; if wordGap<0 then wordGap:=5; x1:=x1+wd+wd*(xs-1)+wordGap; end; begin x1:=0; bs:=bs*3; if bs<3 then bs:=3; Image:=TImage.Create(nil); Image.Width:=Width; Image.Height:=Height; Image.Canvas.Brush.Color := clBlack; Image.Canvas.FillRect(rect(0,0,Width,Height)); Image.Canvas.Brush.Color :=TextColor; Image.Canvas.Pen.Color := clBlack; if Length(str) > 0 then begin for i := 0 to utf8Length(str) - 1 do begin strChar := utf8Copy(str, i+1, 1); if ord(strChar[1])>127 then MakeChar(Image,strChar,true,bs,wordGap) else MakeChar(Image,strChar,false,bs,wordGap); end; Images.Picture.Assign(Image.Picture); end; FreeAndNil(image); end; procedure LoadFontResource; var ResHandle: TLResource; begin ResourceStream := TResourceStream.Create(HInstance, 'HZK16', RT_RCDATA); try Hzk16FontData:=TMemoryStream.Create; ResourceStream.Position:=0; ResourceStream.SaveToStream(hzk16FontData); finally ResourceStream.Free; end; ResourceStream := TResourceStream.Create(HInstance, 'ASC16', RT_RCDATA); try ASC16FontData:=TMemoryStream.Create; ResourceStream.Position:=0; ResourceStream.SaveToStream(ASC16FontData); finally ResourceStream.Free; end; end; Initialization LoadFontResource; finalization end.
编译后已不用带hzk16.bin和asc16.bin,在Linux运行正常:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)