标题:菜鸟「求助」 西文DOS下显示16点阵汉字的问题
只看楼主
roblou
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2013-3-30
结帖率:100%
已结贴  问题点数:20 回复次数:7 
菜鸟「求助」 西文DOS下显示16点阵汉字的问题
源代码在下面的
可以运行,运行后只显示汉字“西文”,后面的“DOS下显示16点阵汉字”就没有了。然后在   char *Str="西文DOS下显示16点阵汉字"   语句中去掉“DOS”后,运行后就显示为“西文下显示” ……总之就是不能显示英文或数字,摸索不出来不知道怎么改,求指导
#include<conio.h>
#include<graphics.h>
#include<stdio.h>
#include<stdlib.h>
FILE *fp;
void InitGra(void);
int OpenLIB(void);
void Quit(void);
void PutCC16(int,int,int,int,char*Str);
void ErrMsg();
int main(void)
{
    char *Str="西文DOS下显示16点阵汉字";
    InitGra();
    if(! OpenLIB())ErrMsg();
    PutCC16(0,100,2,YELLOW,Str);
    getch();
    Quit();
    return(0);
}
void InitGra(void)
{
    int GraphDrive=DETECT,GraphMode;
    registerbgidriver(EGAVGA_driver);
    initgraph(&GraphDrive,&GraphMode,"C:\\TC30\\BGI");
}
int OpenLIB()
     {
        if((fp=fopen("C:\\TC30\\HZK16","rb"))==NULL) return(0);
         return(1);
     }
void Quit(void)
     {
    closegraph();
    fcloseall();
    exit(0);
        }
void PutCC16(int x,int y,int Wid,int Color,char *Str)
{
  unsigned Zcode,Bcode;
  int i,j,k,Rec;
  long Len;
  char Buf[32];
  while(*Str)
  {
    if ((*Str&0x80)&&(*(Str+1)&0x80))
    {
     Zcode=(*Str-0xa1)&0x07f;
    Bcode=(*(Str+1)-0xa1)&0x07f;
    Rec=Zcode*94+Bcode;
    Len=Rec*32L;
    fseek(fp,Len,SEEK_SET);
    fread(Buf,1,32,fp);
    for (i=0;i<16;i++)
    for (j=0;j<2;j++)
    for (k=0;k<8;k++)
      if (Buf[i*2+j]>>(7-k)&1)
      putpixel(x+j*8+k,y+i,Color);
      x=x+16+Wid;
      Str+=2;
      }
    }
    return;
    }
   void ErrMsg()
   {
       printf("Open LIB File Error!");
       getch();
       Quit();
   }
搜索更多相关主题的帖子: void include 汉字 
2013-05-16 11:00
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
现在 谁还研究16位dos

DO IT YOURSELF !
2013-05-16 13:02
cuijunchao
Rank: 5Rank: 5
来 自:湖南桂东
等 级:职业侠客
威 望:3
帖 子:132
专家分:386
注 册:2012-4-4
得分:0 
你这个肯定是汉字跟字母不统一导致的,要么统一为点阵,要么分开处理。
2013-05-16 13:16
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:20 
你的字库没有ASCII半角字符

授人以渔,不授人以鱼。
2013-05-16 21:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
HZK16只是GB2312的16点阵字模库,但那些ASCII字符是8*16点阵的(也有一些是别的点阵规模,视字库的不同而不同),另外有个ASCII字模库,你仅仅打开一个字库文件是不够的。如果你实在只有一个字库,就尝试把ASCII字符映射到对应的全角字符上去,虽然显示出来的效果稍有变形(半角变全角),也胜于显示不了。

另外,看你的代码,明显是没有区分ASCII字符与汉字的,当显示中英夹杂的文字时必然是乱码。

[ 本帖最后由 TonyDeng 于 2013-5-16 22:04 编辑 ]

授人以渔,不授人以鱼。
2013-05-16 21:58
roblou
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2013-3-30
得分:0 
回复 5楼 TonyDeng
加了一小段,改成这样子呢?还是没法正确显示英文
#include<conio.h>
#include<graphics.h>
#include<stdio.h>
#include<stdlib.h>
FILE *fp;
void InitGra(void);
int OpenLIB(void);
void Quit(void);
void PutCC16(int,int,int,int,char*Str);
void ErrMsg();
int main(void)
{
    char *Str="西文DOS下显示16点阵汉字";
    InitGra();
    if(! OpenLIB())ErrMsg();
    PutCC16(0,100,2,YELLOW,Str);
    getch();
    Quit();
    return(0);
}
void InitGra(void)
{
    int GraphDrive=DETECT,GraphMode;
    registerbgidriver(EGAVGA_driver);
    initgraph(&GraphDrive,&GraphMode,"C:\\TC30\\BGI");
}
int OpenLIB()
     {
        if((fp=fopen("C:\\TC30\\HZK16","rb"))==NULL) return(0);
         return(1);
     }
void Quit(void)
     {
    closegraph();
    fcloseall();
    exit(0);
        }
void PutCC16(int x,int y,int Wid,int Color,char *Str)
{
  unsigned Zcode,Bcode;
  int i,j,k,Rec;
  long Len;
  char Buf[32];
  while(*Str)
  {
    if ((*Str&0x80)&&(*(Str+1)&0x80))
    {
     Zcode=(*Str-0xa1)&0x07f;
    Bcode=(*(Str+1)-0xa1)&0x07f;
    Rec=Zcode*94+Bcode;
    Len=Rec*32L;
    fseek(fp,Len,SEEK_SET);
    fread(Buf,1,32,fp);
    for (i=0;i<16;i++)
    for (j=0;j<2;j++)
    for (k=0;k<8;k++)
      if (Buf[i*2+j]>>(7-k)&1)
      putpixel(x+j*8+k,y+i,Color);
      x=x+16+Wid;
      Str+=2;
     }
      else
     {
      settextstyle(1,0,2);
      outtextxy(x,y,*Str);
      x=x+10+Wid;
      Str+=1;
     }

  }

    return;
}

   void ErrMsg()
   {
       printf("Open LIB File Error!");
       getch();
       Quit();
   }


2013-05-18 11:38
roblou
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2013-3-30
得分:0 
回复 4楼 TonyDeng
不是很明白
2013-05-18 11:39
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
把那些ASCII字符删掉看看就知道了

授人以渔,不授人以鱼。
2013-05-18 11:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-407230-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.049209 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved