你只能自己做一个输出汉字的程序了先找到一个16*16点阵的汉字库,UCDOS下的HZK16(好像这名字)可以用,它是按照区位码编排的,是点阵的然后你根据汉字内码与区位码的对应关系,找到字库中的相应点阵,描点就行了能提醒你的就是可以不用一个一个描,用Line就可以 for i:=1 to 16 do begin SetLineStyle(UserBitLn,Swap(BufC[i]),NormWidth); Line(x+15,y+i-1,x,y+i-1); end; 我大学时做了一个Turbo Pascal程序员用的汉字显示函数包,可惜扔了很多年了
coldwindtang (coldwindtang) :所需的例子程序已经编好,在tp7下通过,源程序如下:uses crt,graph; var fcdot:file; procedure outctext(s:string); const lr:array[0..7] of byte=(128,64,32,16,8,4,2,1); var hi,lo,n,t,xc,yc,x,y,k,i,m:integer; buf:array[0..31] of byte; begin if length(s)=0 then exit; k:=1; xc:=getx; yc:=gety; repeat case ord(s[k]) of 128..255: begin hi:=ord(s[k])-160; lo:=ord(s[k+1])-160; if hi>9 then hi:=hi-6; n:=(hi-1)*94+(lo-1); seek(fcdot,n); {$I-} blockread(fcdot,buf,1,m); {$I+} if ioresult<>0 then begin halt; end; t:=0; for y := 0 to 15 do begin x:=xc; for i:=0 to 7 do begin x:=x+1; if buf[t] and lr[i]<>0 then putpixel(x,yc+y,getcolor); end; t := t+1; for i:=0 to 7 do begin x:=x+1; if buf[t] and lr[i]<>0 then putpixel(x,yc+y,getcolor); end; t := t+1; end; k:=k+1; xc:=xc+16; end; 32..127: begin moveto(xc,yc-2); settextstyle(0,0,1); outtext(s[k]); xc:=xc+textwidth(s[k]); end; else exit; end;{case} k:=k+1; until k>length(s); end;var gd,gm:integer;begin gd:=detect; initgraph(gd,gm,''); assign(fcdot,'cclibj.dot'); reset(fcdot,32); moveto(280,240); outctext('文件阅读程序'); readkey; end.
请问在: zzwu(未名) 提供给我的代码中。 uses crt,graph; var fcdot:file; procedure outctext(s:string); const lr:array[0..7] of byte=(128,64,32,16,8,4,2,1); var hi,lo,n,t,xc,yc,x,y,k,i,m:integer; buf:array[0..31] of byte; begin if length(s)=0 then exit; k:=1; xc:=getx; yc:=gety; repeat case ord(s[k]) of 128..255: begin hi:=ord(s[k])-160; lo:=ord(s[k+1])-160; if hi>9 then hi:=hi-6; //就是这句不理解 n:=(hi-1)*94+(lo-1); seek(fcdot,n); {$I-} blockread(fcdot,buf,1,m); {$I+} if ioresult<>0 then begin halt; end; t:=0; for y := 0 to 15 do begin x:=xc; for i:=0 to 7 do begin x:=x+1; if buf[t] and lr[i]<>0 then putpixel(x,yc+y,getcolor); end; t := t+1; for i:=0 to 7 do begin x:=x+1; if buf[t] and lr[i]<>0 then putpixel(x,yc+y,getcolor); end; t := t+1; end; k:=k+1; xc:=xc+16; end; 32..127: begin moveto(xc,yc-2); settextstyle(0,0,1); outtext(s[k]); xc:=xc+textwidth(s[k]); end; else exit; end;{case} k:=k+1; until k>length(s); end;var gd,gm:integer;begin gd:=detect; initgraph(gd,gm,''); assign(fcdot,'cclibj.dot'); reset(fcdot,32); moveto(280,240); outctext('文件阅读程序'); readkey; end. 。 这句“ if hi>9 then hi:=hi-6; ”是什么意思啊?我读不懂。 而且删了之后运行正常,保留这句返倒运行出来是乱码。这应该不是 他写错了的,绝对有什么原因在里面。 请哪个有耐心的帮我看看。感激。 新年快乐。
begin
Write('Enter a line of text: ');
Readln(s);
Writeln('You typed: ',s);
Writeln('Hit <Enter> to exit');
Readln; end.
program tt;
uses graph;
procedure graph_init;
var errorcode,GraphDriver, GraphMode: Integer;
begin
registerbgidriver(@egadriver);
GraphDriver := Detect;
InitGraph(GraphDriver, GraphMode, ' ');
errorcode:=Graphresult;
if errorcode<> grOk then
begin
writeln('Init the graph error ! Error code :',errorcode);
Halt(1);
end;
setbkcolor(colorbk);
setcolor(color);
rectangle(1,1,getmaxx,getmaxy);
end;
begin
graph_init;
writeln('这是一个例子');
end.这样的程序百分之百运行错误。
我说过了,是在图形方式下。你那个程序不是在图形方式下的。
在图形方式下,输出字,不管是中文还是英文,都需要相应的字库,我问的就
是怎么样使用这个字库。
begin
writeln('这是一个例子');
readln;
end.
在全屏下都看不到中文,只是乱码。不信你试试。
我只用过两种,一种是在表单等可视控件上用Textout输出,
一种是写如basic中的dos程序,用writeln就可以
你说的这种没有用过,关注。
调用一个函数,告诉它你的字体文件,把返回值作为设置输出字体时的字体参数.
具体函数我都忘了,手头也没有Turbo Pascal,Turbo Pascal中有详细的帮助,你可以看一下.
TextOutxy(L,T,'a atr'),或者OutTextxy(L,T,'a str');我记不清了,L,T,是显示的位置
SetLineStyle(UserBitLn,Swap(BufC[i]),NormWidth);
Line(x+15,y+i-1,x,y+i-1);
end;
我大学时做了一个Turbo Pascal程序员用的汉字显示函数包,可惜扔了很多年了
用outtext吧
记得用到的Ucdos里的点阵字库,还先查到该汉字的位置(“偏移量”?)
1.一般的字库结构(国标?)
---------------
字数 = 区(87) * 位(94) = 8178
每字的点阵占用空间(vSize):
以16*16为例,每字vSize = 16pxl * 16pxl / 8bit = 32 byte 2.区位与机内码
---------------
type
机内码 = integer; {(int16)} 机内码低字节值 + 160 = 区码
机内码高字节值 + 160 = 位码 3.取点阵
(1)计算地址(vOffset)
偏移vOffset := ((区码 - 1) * 94 + 位码 - 1) * vSize (2)如果使用EMS或XMS,要作一下内存映射
(3)写屏
都要在的图形方式下输出中文,
不用Overlay技术,
而且还要的图形方式下输入中文,
而且无需进入任何中文操作系统.待我一有空就来详细回复本问题,而现在有其他事情.
最基本的函数是描一个点,
首先你要明白字你的字库是点阵字库(而不是矢量字库),点阵嘛就是一个方阵0/1表示一个点是否着色,你先研究一下字库文件的结构就行了,有些字库是按行存点阵,有些是按列存。C的代码我也有,改成Pascal语言表达有那么困难吗?
var fcdot:file;
procedure outctext(s:string);
const lr:array[0..7] of byte=(128,64,32,16,8,4,2,1);
var hi,lo,n,t,xc,yc,x,y,k,i,m:integer;
buf:array[0..31] of byte;
begin
if length(s)=0 then exit;
k:=1;
xc:=getx; yc:=gety;
repeat
case ord(s[k]) of
128..255:
begin
hi:=ord(s[k])-160; lo:=ord(s[k+1])-160;
if hi>9 then hi:=hi-6;
n:=(hi-1)*94+(lo-1);
seek(fcdot,n);
{$I-} blockread(fcdot,buf,1,m); {$I+}
if ioresult<>0 then begin halt; end;
t:=0;
for y := 0 to 15 do
begin
x:=xc;
for i:=0 to 7 do
begin
x:=x+1;
if buf[t] and lr[i]<>0 then
putpixel(x,yc+y,getcolor);
end;
t := t+1;
for i:=0 to 7 do
begin
x:=x+1;
if buf[t] and lr[i]<>0 then
putpixel(x,yc+y,getcolor);
end;
t := t+1;
end;
k:=k+1;
xc:=xc+16;
end;
32..127:
begin
moveto(xc,yc-2);
settextstyle(0,0,1);
outtext(s[k]);
xc:=xc+textwidth(s[k]);
end;
else exit;
end;{case}
k:=k+1;
until k>length(s);
end;var gd,gm:integer;begin
gd:=detect;
initgraph(gd,gm,'');
assign(fcdot,'cclibj.dot');
reset(fcdot,32);
moveto(280,240);
outctext('文件阅读程序');
readkey;
end.
还有就是putpixel也太慢了。当然如果只是显示一点点汉字,这种方法简单好用,但要求高一些的话,还是我先头提到的那两个技术
DOS纯Pascal没有意义了,Windows下是Delphi的
TP7还有Patch的才在Windows 2000/XP下运行,否则
runtime error 216的
uses crt,graph;
var fcdot:file;
procedure outctext(s:string);
const lr:array[0..7] of byte=(128,64,32,16,8,4,2,1);
var hi,lo,n,t,xc,yc,x,y,k,i,m:integer;
buf:array[0..31] of byte;
begin
if length(s)=0 then exit;
k:=1;
xc:=getx; yc:=gety;
repeat
case ord(s[k]) of
128..255:
begin
hi:=ord(s[k])-160; lo:=ord(s[k+1])-160;
if hi>9 then hi:=hi-6; //就是这句不理解
n:=(hi-1)*94+(lo-1);
seek(fcdot,n);
{$I-} blockread(fcdot,buf,1,m); {$I+}
if ioresult<>0 then begin halt; end;
t:=0;
for y := 0 to 15 do
begin
x:=xc;
for i:=0 to 7 do
begin
x:=x+1;
if buf[t] and lr[i]<>0 then
putpixel(x,yc+y,getcolor);
end;
t := t+1;
for i:=0 to 7 do
begin
x:=x+1;
if buf[t] and lr[i]<>0 then
putpixel(x,yc+y,getcolor);
end;
t := t+1;
end;
k:=k+1;
xc:=xc+16;
end;
32..127:
begin
moveto(xc,yc-2);
settextstyle(0,0,1);
outtext(s[k]);
xc:=xc+textwidth(s[k]);
end;
else exit;
end;{case}
k:=k+1;
until k>length(s);
end;var gd,gm:integer;begin
gd:=detect;
initgraph(gd,gm,'');
assign(fcdot,'cclibj.dot');
reset(fcdot,32);
moveto(280,240);
outctext('文件阅读程序');
readkey;
end.
。
这句“ if hi>9 then hi:=hi-6; ”是什么意思啊?我读不懂。
而且删了之后运行正常,保留这句返倒运行出来是乱码。这应该不是
他写错了的,绝对有什么原因在里面。
请哪个有耐心的帮我看看。感激。
新年快乐。