"一种自动把汉字点阵嵌入程序的方法"
本刊97年第2期刊发了谢玉辉老师的"一种自动把汉字点阵嵌入程序的方法"一文(以下简称"嵌入"),此文很巧妙将C语言源程序中的汉字点阵嵌入源程序中,确实如谢老师所说的"可使用应用程序脱离汉字库显示汉字,而且显示速度很快,实用性和通用性较好"。下面笔者,就此文介绍的方法作进一步扩充,让你的应用程序真正能做到"实用性和通用性都较好",算是以此抛砖引玉。
一、几点改进意见
为了能使用户的应用程序能脱离中文环境显示汉字,"嵌入"一文将用户C语言源程序中的汉字均视为西文方式下要显示的汉字,将它们的点阵信息取出后放入hzk.dat文件定义的数组hzk中,这不仅显得有些牵强,而且非常不切合实际。如下述一段程序:
.....
printf("没有什么可以比这好"); /*显示字符串*/
...
以上源程序中,虽然用到了汉字,但没有一个汉字是要在西文图形方式下显示的字串,因此没有必要将它们嵌入hzk.dat文件中。这也正如谢老师所说"为了节约空间","扫描前可去掉源程序中的汉字注释"。其实我们通常显示的字串都用双引号将它们括起来(程序执行时,动态改变的字串和格式化字串除外),因此我们一般只要对双引号中的汉字进行扫描即可,没有必要去扫描注释中的汉字,也没必要"去掉源程序中的汉字注释"。当然,这样做又给我们出以一道难题:并不是所有双引号中的汉字都进行扫描的。为了解决这一问题,笔者认为在字串中设置标志是一种较好的解决方法。在此,笔者作如下设定:想在西文图形方式下显示的字串前用"@"字符前缀说明,不用的则不必要说明。
如:
printf("我叫江龙,74年8月出生");
.....
Show("@我原毕业于湖北沙洋师范学校小教数学专业");
.....
则程序便很容易区分某一字串的扫描与否。当然若用户不需要扫描的字符串第一个字符为"@",则书写式要加入"弊址par 这样一来,以上问题便较好的解决了。但另一个问题又出现了,在书写注释时,用户应该避免有""@"这样的字串,因为程序在扫描中,是对""@"进行的(若一定要出现,请在前面加上"@"字符串出现的,因为它们通常前面加上了""@"printf("12,23 say @12,32")。void ShowString(int x,int y, /*显示的坐标*/ unsigned char *s, /* 字符串*/ char forecolor,char bkcolor) /*前、背景色*/
如,用户在C语言源程序中有如下的程序段:
#include <conio.h>
#include <dos.h>
void SetShowMode(int mode) /*设置显示模式*/;
main()
int i;
char *text[2]="@我是中国人",
"@imde没有什么可以";
printf("wellcome use if.");
SetShowMode(0x12);
for(i=0;i<2;i++)
ShowString(100,(i+2)*18,text[i],RED,BLUE);
getch();
SetShowMode(3);
void SetShowMode(int mode) /*设置显示模式*/
union REGS r;
r.h.al=mode;
r.h.ah=0;
int86(0x10,&r,&r);
则text字串,将会自动转换成图形方式下的字串;而没有加"@"字符的字串,将不会转换,如上述的"wellcome use if."。若用户不想转换的字符串第一个字符为"@",可在前加上"即可。
2、程序使用方法
⑴、在DOS下先将源程序转换成要求的C源程序
HHC <用户C语言源程序> <目的C语言源程序>
此时,会在用户目录下建立一个useword.dat文件(汉字字模和ASC字模数据文件)其变量说明如下:
__AscMode__[][16] /*所用的ASCII字模数据*/ __WordMode__[][32] /*所用的汉字字模数据*/
⑵、在TC环境下编译、连接<目的C语言源程序>或直接在DOS下用tcc编译连接。
tcc <目的C语言源程序>
生成的exe文件即可直接在西文图形方式下运行。
3、注意事项:
⑴、用户在调用ShowString()函数前,一定要将屏幕设置成图形方式(本程序需要VGA显示卡支持才能使用,若用户使用的显示器不为VGA,可对程序ShowHz.c进行修改)。
⑵、显示字符串函数请用ShowString(),若用户使用的函数与此相近,请用define定义,如用户使用的函数为show(),则可在生成的目的源程序中,加入如下语句:\par #define show(....) ShowString(x,y,string,color,bkcolor)
("..."表示如此对应的参数)。