我找了一下资料,只找到了在Tubro C下图形方式输出中文的方法。本来想照着c的样子做,但却做不出来。
   我知道要用到字库文件,我也在UCDOS里找到了,但不知道怎么用。
   哪位高手能给我解释一下吗?

解决方案 »

  1.   

    Canvas.textout(10,10,'一个小例子');
      

  2.   

    而且不是用DELPHI。而是用PASCAL的graph单元。
      

  3.   

    var   s : string;
     begin
       Write('Enter a line of text: ');
       Readln(s);
       Writeln('You typed: ',s);
       Writeln('Hit <Enter> to exit');
       Readln; end.
      

  4.   

    这种方法在图形方式下根本不行。你难道没试过?
    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.这样的程序百分之百运行错误。
      

  5.   

    netlib(河外孤星) 
    我说过了,是在图形方式下。你那个程序不是在图形方式下的。
      

  6.   

    我的意思是在图形方式下。图形方式你一定见过的嘛。比如说以前的hdcopy.
    在图形方式下,输出字,不管是中文还是英文,都需要相应的字库,我问的就
    是怎么样使用这个字库。
      

  7.   

    netlib(河外孤星) ,就是不用图形方式,你那个程序:
    begin
      writeln('这是一个例子');
      readln;
    end.
    在全屏下都看不到中文,只是乱码。不信你试试。
      

  8.   

    你说的这个我不清楚,
    我只用过两种,一种是在表单等可视控件上用Textout输出,
    一种是写如basic中的dos程序,用writeln就可以
    你说的这种没有用过,关注。
      

  9.   

    字库要先调用一个函数装载.你装载了吗?
    调用一个函数,告诉它你的字体文件,把返回值作为设置输出字体时的字体参数.
    具体函数我都忘了,手头也没有Turbo Pascal,Turbo Pascal中有详细的帮助,你可以看一下.
      

  10.   

    好像是:
    TextOutxy(L,T,'a atr'),或者OutTextxy(L,T,'a str');我记不清了,L,T,是显示的位置
      

  11.   

    你只能自己做一个输出汉字的程序了先找到一个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程序员用的汉字显示函数包,可惜扔了很多年了
      

  12.   

    没有汉字系统(直接写屏)的用write不行
    用outtext吧
      

  13.   

    唉~~以前大二学C语言的时候做过,忘了~~~
    记得用到的Ucdos里的点阵字库,还先查到该汉字的位置(“偏移量”?)
      

  14.   

    我几年前用 C++ 做过,但没有用 PASCAL 实现,主要是指针的灵活性当时的 PASCAL 不如 C 舒服。原理是用 UCDOS 的点阵字库,字库是按区位排好的,首先把字库载入到内存(不载入内存会很慢),用一个算法定位到要显示的汉字的点阵位置。然后通过画点的方法把点阵画出来。这里设计到两个技术。一个是 XMS ,如果不在保护模式下编程,那么DOS的内存只有 640K ,而字库就占用了近200多K,所以要把字库放在扩展内存里面。第二个是直接写屏技术(不用直接写屏会很慢),该技术需要参考 VESA 标准。
      

  15.   

    Turbo Pascal?多年以前我就很喜欢它。我找了一下资料,看看是否能帮助你:
       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)写屏
      

  16.   

    老兄,你装了UCDos之类的支持中文的字库了吗?
      

  17.   

    如果觉得DOS下内存不足,也可以考虑使用Turbo Pascal的Overlay技术,将数据打包为可以overlay的数据,需要的时候可以自动载入
      

  18.   

    我作过大量大量的pascal程序,
    都要在的图形方式下输出中文,
    不用Overlay技术,
    而且还要的图形方式下输入中文,
    而且无需进入任何中文操作系统.待我一有空就来详细回复本问题,而现在有其他事情.
      

  19.   

    说白了就是描点,
    最基本的函数是描一个点,
    首先你要明白字你的字库是点阵字库(而不是矢量字库),点阵嘛就是一个方阵0/1表示一个点是否着色,你先研究一下字库文件的结构就行了,有些字库是按行存点阵,有些是按列存。C的代码我也有,改成Pascal语言表达有那么困难吗?
      

  20.   

    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.
      

  21.   

    楼上的例子不错,不过这样会很慢的 :(每显示一个字就要读一个字模数据,如果是一篇大文章?
    还有就是putpixel也太慢了。当然如果只是显示一点点汉字,这种方法简单好用,但要求高一些的话,还是我先头提到的那两个技术
      

  22.   

    大多数是使用UCDOS等汉字系统的
    DOS纯Pascal没有意义了,Windows下是Delphi的
    TP7还有Patch的才在Windows 2000/XP下运行,否则
    runtime error 216的
      

  23.   

    请问在: 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; ”是什么意思啊?我读不懂。
    而且删了之后运行正常,保留这句返倒运行出来是乱码。这应该不是
    他写错了的,绝对有什么原因在里面。
        请哪个有耐心的帮我看看。感激。
        新年快乐。
      

  24.   

    修改code page 为935能行否(console下的chcp.com程序可改代码页)?