找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 7309|回复: 25

那F11显示中文是不是这个做的(老大们来看看)

[复制链接]
发表于 2007-3-5 13:03:19 | 显示全部楼层 |阅读模式
涉及UCDOS7.0特显功能的调用;英文DOS下,以画点和写屏方式显示汉字技术,
不带汉字库实现中文界面技术。部分代码刚刚修改过,程序是2001年写的,终于被我找到代码。
由于本人做事一向追求完美,本来这点东西懒得往上搬了,但为了使内容完善一点。
还是搬上来了!

在图文混合模式(假图形模式)下:   
      使用汉字不要太简单,但只能支持640*480的显示。   
  在纯图形模式下:   
      方法一:逐点描绘点阵汉字   
      方法二:用矢量汉字   
      以上方法,均可以直接写屏方式。

DOS下汉字库制作程序源代码.rar


应该是这个东东做的 可那个论坛不给注册下载了 郁闷

哈哈经过一位兄弟的帮忙DOS下汉字库制作程序源代码终于给下载了  我传上来大家研究下 我不怎么懂

[ 本帖最后由 nbyxqtld 于 2007-3-5 01:28 PM 编辑 ]

DOS下汉字库制作程序源代码.rar

115.64 KB, 下载次数: 262, 下载积分: 无忧币 -2

 楼主| 发表于 2007-3-5 13:05:50 | 显示全部楼层
还有这个


英文DOS下,不带汉字库实现中文界面的方法:
1、列出界面上需要的所有字符串。
2、利用下面的GetZMToFile()程序段,将这些需要使用的字符串对应的字模全部转存到不同的C语言源文件中。
3、将第二步生成的C源文件中的代码复制到一个公共头文件中(头文件示例),这样就有了一个专用的字模库,将跟随程序一起编译,即免去汉字库。
4、有了ASCII字模头文件,就可以编写相应的汉字显示程序了,详见我写的一套从专用ASCII字模头文件显示汉字的程序。
附:程序段1----GetZMToFile();
功能:可以将指定字符串的字模读出,转存到一个C语言源码文件,以生成专用字模库。
///////////////////////////////////////////////////////////////////////

int      GetZMToFile(int h,int w,int type,char *arrayname,unsigned char *HZPTR,
                                         char *filename)
//w汉字的宽度;h汉字的高度;type字型号(字体,1仿宋,2黑,3楷,4宋);
//space字间距;isHorizontal竖向显示标致;xPosition 列坐标位置;yPosition 行坐标位置;
                          //HZPTR为所要显示的字符串;color汉字的颜色;
{
int HZKFILE;                             //汉字库文件句柄;
FILE *zmfile;
int HZSIZE;//,old_w;                         //字模数组长度;
unsigned char HZKMAT[801];//存放字模的数组,假设可能出现的最大汉字是80X80;
unsigned char WriteMat[801];
char hzkname[80];                         //暂存库名的数组;
char ch[8];               //临时数组,用于整型数到字符型数的转换;
unsigned char qh,wh;                     //汉字的区号和位号;
unsigned long offset;               //字库文件内部指针的定位标致;
unsigned char c_qh,c_wh;                   //暂存x坐标的变量;
//unsigned char mask[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
register int i,k,x0,y0,pos;               //只用于计数的变量;
char      test[80];
unsigned char zm[16][2][8];
char c_ch[5];
int      arr_a,arr_b;
unsigned char *p;
int n = 0 ;

arr_a = 0 ;
p = HZPTR;
while(*p!='\0')
{
      if(*p & 0x80)
           p++;
      arr_a ++ ;
      p ++ ;
}

memset(HZKMAT,0,801);             //将数组HZKMAT中的所有元素清零;
// old_w=w; //将原始的 w 记下来,因为 w 的宽度不一定是汉字的宽度用于字间距;
memset(hzkname,0,80);//将 hzkname 中的所有元素清零,为稳定性而加,可不要;
strcpy(hzkname,"..\\hzk\\zk");//             \
strcat(hzkname,itoa(h,ch,10));//             |
strcat(hzkname,"x");//                     >--形成字库文件名;
strcat(hzkname,itoa(w,ch,10));//             |
strcat(hzkname,itoa(type,ch,10));//           /

if((HZKFILE=open(hzkname,O_RDONLY|O_BINARY))==-1) //共享方式打开汉字库;
{         //如果打不开汉字库则将最相似大小的字库打开并从中读取字模;
      Clrscr(0,0,getmaxx(),getmaxy(),0);               //清除全屏;
      closegraph();
      printf("\nCan not open hzk !");     //输出文件没有打开的提示信息;
      getch();                     //接受一个键盘输入(任意键);
      exit(1);                         //函数返回 -1 出错标致;
}
else                 //如果汉字库打开了,则计算其宽度,以读取字模;
{
     if((w%8)>=1)
      w=(w/8)*8+8;     //如果汉字的宽度模8大于等于1则算另外一个字节计算;
     else                             //即将宽度加上一个字节;
      w=w/8*8;                 //否则其小于1的话,将按原字节数计算;
     HZSIZE=w/8*h;                     //计算将要读取多少位字模;
}
arr_b = HZSIZE;

//---------------------------------------------------------------------
     if((zmfile = fopen( filename, "w+" ) ) == NULL)
     {                                 //若汉字库没有打开;
      closegraph();
      printf("\nCan not open file : \"%s\" !",filename);     //输出文件没有打开的提示信息;
      getch();                     //接受一个键盘输入(任意键);
      exit(1);                         //函数返回 -1 出错标致;
     }
     fprintf(zmfile,"\t\n/*---------------------------------------------------------------------*/\n");
     fprintf(zmfile,"\t/*%s*/\n",HZPTR);
     fprintf(zmfile,"\tint      %s[%d][%d] = {\n",
                                arrayname, arr_a, arr_b );
//      fprintf(zmfile,"\tmemset(%s,'\\0',%d*%d);\n",arrayname,arr_a,arr_b);

n = 0 ;
while(*HZPTR!=NULL)
{
      if((*HZPTR&128)!=0)                 //判断其是否为汉字;
      {
      //如果列坐标超出了640,不能再显示下一个汉字时,而汉字又没有显示完,
//则将列坐标重新设置为零,横坐标加上此行汉字的高度再加上4,目的是为了美观;
      qh=HZPTR[0]-0xa0;//                     \
      wh=HZPTR[1]-0xa0;//                     |
      offset=(long)(94*(qh)+(wh))*HZSIZE;//       >--- 取字模;
      lseek(HZKFILE,offset,SEEK_SET);//           |
      read(HZKFILE,HZKMAT,HZSIZE);//             /
memset(WriteMat,'\0',801);
     strcpy(WriteMat,"\t{");
     for(i = 1 ; i <= arr_b ; i ++)
     {
           if((int)HZKMAT[i-1] < 10 )
                 sprintf(c_ch," %d",(int)HZKMAT[i-1]);
           else
                 if((int)HZKMAT[i-1] < 100)
                       sprintf(c_ch," %d",(int)HZKMAT[i-1]);
                 else
                       sprintf(c_ch,"%d",(int)HZKMAT[i-1]);
           if( i!=arr_b)
           {
                 c_ch[3] = ',' ;
                 c_ch[4] = '\0';
           }
           else
                 c_ch[3] = '\0';
           strcat(WriteMat,c_ch);

           if(i%16==0)
           {
                 if(i!=arr_b)
                       strcat(WriteMat,"\n");
                 fprintf(zmfile,"%s",WriteMat);
                 memset(WriteMat,'\0',801);
                 if(i!=arr_b)
                       strcpy(WriteMat,"\t ");
           }
     }
     {
     strcat(WriteMat,"}");
     if(*(HZPTR+2)!='\0')
           strcat(WriteMat,",\n");
     fprintf(zmfile,"%s",WriteMat);
     memset(WriteMat,'\0',801);
     }
      n ++ ;
      HZPTR+=2; //的汉字宽度,HZPTR+=2是将要显示的字符串向后移两个字;
      }                         //节,因为汉字占用两个字节;
      else                               //如果不是汉字;
     //-------------以下是对ASCII码的显示方法及其控制--------------//
      {
      offset = HZPTR[0]-0x21;
      if(HZPTR[0]==' ')
           offset = 92*94+HZSIZE;
      lseek(HZKFILE,offset*HZSIZE*1L,SEEK_SET); //移文件指针到字库文
      read(HZKFILE,HZKMAT,HZSIZE);               //件ASCII码开始处;
     memset(WriteMat,'\0',801);
     strcpy(WriteMat,"\t{");
     for(i = 1 ; i <= arr_b ; i ++)
     {
//            if((int)HZKMAT[i-1] == ' '||(int)HZKMAT[i-1] == 0)
//                  strcpy(c_ch," 0");
//            else
           if((int)HZKMAT[i-1] < 10 )
                 sprintf(c_ch," %d",(int)HZKMAT[i-1]);
           else
                 if((int)HZKMAT[i-1] < 100)
                       sprintf(c_ch," %d",(int)HZKMAT[i-1]);
                 else
                       sprintf(c_ch,"%d",(int)HZKMAT[i-1]);
           if( i!=arr_b)
           {
                 c_ch[3] = ',' ;
                 c_ch[4] = '\0';
           }
           else
                 c_ch[3] = '\0';

           strcat(WriteMat,c_ch);

//            if(i != 0 && i % 20 == 0 )
           if(i%16==0)
           {
                 if(i!=arr_b)
                       strcat(WriteMat,"\n");
                 fprintf(zmfile,"%s",WriteMat);
                 memset(WriteMat,'\0',801);
                 if(i!=arr_b)
                       strcpy(WriteMat,"\t ");
           }
     }
     {
           strcat(WriteMat,"}");
           if(*(HZPTR+1)!='\0')
                 strcat(WriteMat,",\n");
           fprintf(zmfile,"%s",WriteMat);
           memset(WriteMat,'\0',801);
     }
      n ++ ;
      HZPTR+=1;   //此处的字符指针只移一位,是因为ASC字符只占一个字节;
      }                         //(汉字占两个字节,所以加2);
      }
      close(HZKFILE);                       //关闭汉字库文件;
     fprintf(zmfile,"};\n");
/* if(n<10)
     fprintf(zmfile , "\tstrcpy ( %s[%2d] , \"%s\" );\n",arrayname,n,"\\0");
else
     fprintf(zmfile , "\tstrcpy ( %s[%d] , \"%s\" );\n",arrayname,n,"\\0");
*/ fprintf(zmfile,"/*---------------------------------------------------------------------*/\n");
fclose(zmfile);
return(0);                           //返加0值表示没有出错;
}
///////////////////////////////////////////////////////////////////////
程序段2:Puthz();
功能:利用字模数组中的字模将HZPTR中指定的汉字格式化显示到屏幕上,函数
参数char *HZPTR与GetZMToFile()中的char *HZPTR必须完全相同,其中ZM参数
为GetZMToFile()生成的头文件中的arrayname的地址;具体使用方法见示例。
///////////////////////////////////////////////////////////////////////
int      Puthz(int h,int w,int space,int isHorizontal,
           int slantingflag,int xPosition,int yPosition,
           unsigned char *HZPTR,int *ZM,int color)
            //w汉字的宽度;h汉字的高度;type字型号(字体);space字间距;
//isHorizontal竖向显示标致;slantingflag汉字倾斜标致;xPosition 列坐标位置;
      //yPosition 行坐标位置;HZPTR为所要显示的字符串;color汉字的颜色;
{ ///////////slantingflag为斜体标致,1和2表示斜体(2比1斜得历害),0表示正体;
int HZKFILE;                             //汉字库文件句柄;
// int space = 0,isHorizontal = 0 , slantingflag = 0 ;
int old_w,HZSIZE;                           //字模数组长度;
unsigned char HZKMAT[801];                   //存放字模的数组;
unsigned char qh,wh, ch[8];                     //汉字的区号和位号;
int xx;                               //暂存x坐标的变量;
unsigned char mask[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
int i,j,k,x0,y0,pos;                 //只用于计数的变量;
int n = 0 ,arr_a,arr_b;
char *p;

arr_a = 0 ;
p = HZPTR;
while(*p!='\0')
{
      if(*p & 0x80)
           p++;
      arr_a ++ ;
      p ++ ;
}
memset(HZKMAT,0,801);             //将数组HZKMAT中的所有元素清零;
old_w=w; //将原始的 w 记下来,因为 w 的宽度不一定是汉字的宽度用于字间距;
{
     if((w%8)>=1)
           w=(w/8)*8+8;     //如果汉字的宽度模8大于等于1则算另外一个字节计算;
     else                             //即将宽度加上一个字节;
      w=w/8*8;                 //否则其小于1的话,将按原字节数计算;
     HZSIZE = w/8*h;
     arr_b = HZSIZE;
}

//---------------------------------------------------------------------
xx=xPosition;                              //将原始的列坐标暂存;
n = 0 ;
while(*HZPTR!=NULL)
{
      if((*HZPTR&128)!=0)                 //判断其是否为汉字;
      {
      if(isHorizontal==0)               //判断是否为横向显示;
      {
        if((xPosition+w+space)>=640&&*HZPTR!=NULL)
        {             //如果当前的列坐标不能显示下一个汉字则换行;
           yPosition+=h+4,   //以上功能用当前x坐标加上汉字的宽度w再加
           xPosition=0;                   //上字间距space来实现;
        }
      }
      //如果列坐标超出了640,不能再显示下一个汉字时,而汉字又没有显示完,
//则将列坐标重新设置为零,横坐标加上此行汉字的高度再加上4,目的是为了美观;
     if(isHorizontal==1) yPosition+=h+space,xPosition=xx;
     for( i = 0 ; i < arr_b ; i ++)
           HZKMAT = (unsigned char)(*(ZM+n++));
      y0=yPosition;//将汉字显示位置的行坐标暂存,以在显示下一汉字时用;
      for( i=0 ; i<h ; i++ )       //从汉字的0行到汉字的高度循环;
      {
        x0=xPosition;   //将汉字显示的列坐标暂存,以在下一条显示时使用;
        pos=w/8*i; //此行中的pos用于字模数组HZKMAT中下标定位,以取字模;
        for(j=0;j<w;j++)                 //从0到汉字的宽度循环;
        {
           if((mask[j%8]&HZKMAT[pos+j/8])!=NULL)//按位相与后不为0则画点;
            if(slantingflag>=2)putpixel(x0+(h-i),y0,color);//断倾斜标致;
            else if(slantingflag==1)putpixel(x0+(h/2-i/2),y0,color);
            else putpixel(x0,y0,color); //屏幕当前坐标按颜色值画点;
           x0++;                       //画好后将列坐标加上1;
        }
        y0++;   //一行字模画完后将画下一行,y0++是将行数加1,到下一行;
      }
      xPosition+=old_w+space; //由于old_w是此函数的入口参数,是最标准;
      HZPTR+=2; //的汉字宽度,HZPTR+=2是将要显示的字符串向后移两个字;
      }                         //节,因为汉字占用两个字节;
      else                               //如果不是汉字;
     //-------------以下是对ASCII码的显示方法及其控制--------------//
      {
      if(isHorizontal==0)               //判断是否为横向显示;
      {
        if((xPosition + w + space)>=640&&*HZPTR!=NULL)
        {             //如果当前的列坐标不能显示下一个汉字则换行;
           yPosition+=h+4;
           xPosition=0;     //以上功能用当前x坐标加上汉字的宽度w再加
        }                           //上字间距space来实现;
      }
      //如果列坐标超出了640,不能再显示下一个汉字时,而汉字又没有显示完,
//则将列坐标重新设置为零,横坐标加上此行汉字的高度再加上4,目的是为了美观;
      if(isHorizontal==1) yPosition+=h+space,xPosition=xx;
      for( i = 0 ; i < arr_b ; i ++ )
                 HZKMAT = (unsigned char)(*(ZM+n++));
      y0=yPosition+h/8;//ASC显示位置的行坐标暂存,以在显示下一ASC时用;
                 //h/8 是为了将ASC字符显示位置降一点,以使其更美观;
//       if( *HZPTR == ' ' )
//       {
//            xPosition+=old_w-old_w/2+space;//ASC没汉字宽,所以减去8以缩字距;
//            continue;
//   }
      for( i=0 ; i<h ; i++ )               //按ASC的高度循环;
      {
        x0=xPosition;//将ASC显示位置的列坐标暂存,以在显示下一条线时用;
        pos=w/8*i;           //   pos用于HZKMAT数组中的下标定位;
        for(j=0;j<w-1;j++)//按ASC的宽度循环, w-1是因为ASC没汉字那么宽;
        {
           if((mask[j%8]&((HZKMAT[pos+j/8])))!=NULL)//按位相与后不为0则画点;
            if(slantingflag>=2)putpixel(x0+(h-i),y0,color);//断倾斜标致;
            else if(slantingflag==1)putpixel(x0+(h/2-i/2),y0,color);
                  else putpixel(x0,y0,color); //屏幕当前坐标按颜色值画点;
           x0++;                       //画好后将列坐标加上1;
        }
        y0++;   //一行字模画完后将画下一行,y0++是将行数加1,到下一行;
      }
      xPosition+=old_w-old_w/2+space;//ASC没汉字宽,所以减去8以缩字距;
      HZPTR+=1;   //此处的字符指针只移一位,是因为ASC字符只占一个字节;
      }                         //(汉字占两个字节,所以加2);
      }
return(0);                           //返加0值表示没有出错;
}
回复

使用道具 举报

 楼主| 发表于 2007-3-5 13:08:32 | 显示全部楼层
我不怎么懂的这些东东的找来的  本来想把那个论坛地址发上来的(因为那论坛的 DOS下汉字库制作程序源代码.rar不注册不给下载,去注册呢,管理员又停止注册  郁闷)
回复

使用道具 举报

 楼主| 发表于 2007-3-5 13:13:48 | 显示全部楼层
还有一个关于这F11显示中文的   转贴的 不是我自己做的


看到有前(钱)人发表了DOS下的东西,咱也凑凑热闹,把毕业设计时用过的一个小东西也拿出来晾晾,别霉了!
这是一个DOS下直接写屏显示16点阵汉字的演示程序
功能由函数OutText()完成,该函数区别于大多数此类函数的特点如下
.支持视区剪裁输出
.支持屏幕任意位置输出(不局限于一般直接写屏方法640X480分辩率下的输出位置必须为8的整数倍)
.支持英文字母及数字的8X16点阵输出
.支持直接写屏下的彩色汉字输出

演示起见,未加入将字库读入XMS内存,并从XMS内存读取字模的代码,因此纯DOS下运行可能会频繁的读硬盘。
要得到有XMS支持的直接写屏功能,可查看EGL程序源代码。
(2001.10.13日注:这个EGL是学校时做的一个DOS下仿Window3.1的界面库(Easy Graphics Library)。很完整,菜单,对话框,鼠标,键盘,图形下闪烁光标,可移动窗口,XMS,动画,位图,编辑控制,检查框,单选钮,push按钮等等,都支持,现在看看那时真是狂热,没有配套磁盘的书中的例子,就用手硬敲。刚才我又大略看了一遍,真是TMD破腚百出,哎,都是过去的事了)
废话说了一大堆,又发了点小感慨,说正题吧,下面是代码,格式为了对齐,把tab全换成了空格,多见谅吧,可执行文件目录下需要hzk16与asc16两个字库文件(ucdos自带)及EGAVGA.BGI这个老东西,如果你硬盘上无这些东西,那请到http://www.csdn.net/filebbs/read_topic.asp?id=677下载打包后文档

补充一句吧,CSDN上卧虎藏龙,小人这点小代码牛人就见怪不怪吧,如果实在不痛快,以后在街上看到我就狗血喷头的骂一顿吧,在这先谢罪了

                                                                                                                       MSVCer(家宝)

/*
OutText.C,Turbo C 2.0
WangJiaBao Create
ShenYang Electric Power Institute,1997.09.19
*/
/*
WangJiaBao Modify for friend
ShenYang Thermo Power Plant,2001.04.20
*/
/*
WangJiaBao Modify for CSDN
ShenYang Thermo Power Plant,2001.10.13
*/

#include "dos.h"
#include "stdio.h"
#include "stdlib.h"
#include "graphics.h"

FILE *fp_hzk,*fp_asc;
/*
OutText()各参数意义:
x 字符串x轴坐标
y 字符串y轴坐标
color 字符串颜色
hz 字符串地址
*/
void OutText(int x,int y,unsigned char color,unsigned char *hz);

main()
{
    int gd=VGA,gm=VGAHI;
    int x,y,len,color,y8X8=2,y8X16=16,bottom=447;
    int wl=120,wt=100,wr=520,wb=315; /* 视区坐标 */
    unsigned long times=1,time1=0,time2=0;
    unsigned char tmpstr[100],\
        *errorhzk="\nError open hzk16\a",\
        *errorasc="\nError open asc16\a",\
        *goon="任意键继续演示",\
        *viewport="演示OutText()函数的视区显示能力",\
        *demoviewstr="在视区(%d,%d,%d,%d)内显示汉字,起点坐标为X=%d Y=%d",\
        *fonts="比较8x8与8x16两种点阵ASCII码字符的输出效果",\
        *hello="小人向各位CSDN的朋友问好",\
        *report="%lu秒输出句子%lu次.",\
        *enddemo="演示OutText()函数的高速写屏能力,任意键结束演示";
   
    if( (fp_hzk=fopen("hzk16","rb"))==NULL ){ /* 打开16*16点阵汉字库文件 */
        printf(errorhzk);
        exit(1);
    }
    if( (fp_asc=fopen("asc16","rb"))==NULL ){ /* 打开ASCII码8*16点阵文件 */
        printf(errorasc);
        fclose(fp_hzk);
        exit(1);
    }
    initgraph(&gd,&gm,"");
   
    /* 1.演示OutText()函数的全屏输出及视区显示能力 */
    setfillstyle(WIDE_DOT_FILL,BLUE);
    bar(0,0,639,479);
    setfillstyle(SOLID_FILL,WHITE);
    bar(wl,wt,wr,wb);
    setviewport(wl,wt,wr,wb,1); /* 定义视区 */
    for(x=y=0;x<=15;x++,y+=16){
        sprintf(tmpstr,demoviewstr,wl,wt,wr,wb,x,y);
        OutText(x,y,BLUE,tmpstr);
    }
    setviewport(0,0,639,479,1); /* 重置视区 */
    OutText(320-strlen(viewport)*4,60,YELLOW,viewport);
    OutText(320-strlen(goon)*4,80,LIGHTCYAN,goon);
    getch();
    /* 2.演示图形模式下的ASCII码字符,以8X8点阵和8X16点阵输出之间的对比 */
    setfillstyle(SOLID_FILL,BLACK);
    bar(0,0,639,479);
    x=0;
    tmpstr[0]=tmpstr[1]='\0';
    textcolor(WHITE);
    do{
        if( x>630 ){ y8X8+=48; y8X16+=48; x=0; }
        outtextxy(x,y8X8,tmpstr);
        OutText(x,y8X16,LIGHTCYAN,tmpstr);
        x+=10;
    }while( ++tmpstr[0]<255 );
    OutText(320-strlen(fonts)*4,200,YELLOW,fonts);
    OutText(320-strlen(goon)*4,220,LIGHTCYAN,goon);
    getch();
    /* 3.演示OutText()函数的高速输出能力 */
    bar(0,0,639,479);
    OutText(639-strlen(enddemo)*8,463,LIGHTCYAN,enddemo);
    y=bottom;
    randomize();
    len=strlen(hello)*8;
    time1=time(); /* 开始时刻 */
    while( !kbhit() ){ /* 当无按键时执行 */
        if( y>=bottom ){
            y=0;
            x=random(639-len);
            color=random(15)+1;
            bottom=bottom<=0?447:bottom-16;
        }
        bar(x-1,y-1,x+len,y+16);
        OutText(x,y++,color,hello);
        sprintf(tmpstr,"%lu",times++);
        bar(0,463,strlen(tmpstr)*8,479);
        OutText(0,463,WHITE,tmpstr); /* 计数 */
    }
    time2=time(); /* 结束时刻 */
    getch();
    bar(0,463,639,479);
    sprintf(tmpstr,report,time2-time1,times);
    OutText(0,463,LIGHTGREEN,tmpstr);
    getch();
    fclose(fp_hzk);
    fclose(fp_asc);
    closegraph();
}

void OutText(int x,int y,unsigned char color,unsigned char *hz)
{
    long i;
    char far *ptr;
    int movebit,ybit;
    struct viewporttype v;
    unsigned char by[32],by1,by2,byte1,byte2,tmp,*byptr;
    getviewsettings(&v);
    x+=v.left; y+=v.top; /* 在视区内显示 */
    if( x<0 || y<0 || x>=639 || y>=479 || x>=v.right || y>=v.bottom ) return;
    ybit= y+15>=v.bottom?v.bottom-y:16; /* Y方向不超过视区的下边界 */
    ybit= ybit<=0?0:ybit;
    /* 采用写方式2 */
    outportb(0x3ce,5);   outportb(0x3cf,2);
    /* 一次写4个位平面 */
    outportb(0x3c4,2);   outportb(0x3c5,255);
    outportb(0x3ce,8);
    while(*hz){
        byte1=(unsigned char)*hz;  byte2=(unsigned char)*(hz+1);
        if( (byte1>=0xa1 && byte1<=0xfe)&&(byte2>=0xa1 && byte2<=0xfe) ){ /* 汉字 */
            byptr=by;
            if(x+15>v.right) break; /* 超出视区不显示 */
            i=(byte1-0xa1)*94+byte2-0xa1;
            i<<=5;
            fseek(fp_hzk,i,SEEK_SET);
            fread(by,32,1,fp_hzk); /* 读汉字点阵 */
            /* 因为一个字节含有8个像素点,必须考虑到起始位置未处于x%8==0时的情况 */
            /* 为此设置一个只从有效的x位置写起的偏移量movebit */
            movebit=x%8; /* 起始位置在缓冲区中字节内相对偏移 */
            for(i=0;i<ybit;i++){
                ptr=MK_FP( 0xA000,(y+i)*80+x/8 );
                by1=*byptr++; by2=*byptr++;
                /* 将汉字点阵的两个字节写入缓冲区 */
                /* 要写8个像点的掩码,此掩码即为汉字的点阵信息,第一个字节 */
                outportb( 0x3cf,by1>>movebit );
                tmp=*ptr;  *ptr++=color; /* 将?/span>
回复

使用道具 举报

发表于 2007-3-6 08:54:50 | 显示全部楼层
你真有才.........比我历害!
回复

使用道具 举报

发表于 2007-3-6 10:54:53 | 显示全部楼层
回复

使用道具 举报

发表于 2007-3-6 13:36:12 | 显示全部楼层
楼上的发一个上来啊。。。
回复

使用道具 举报

发表于 2007-3-6 15:07:31 | 显示全部楼层
长见识了!
回复

使用道具 举报

发表于 2007-3-6 15:10:39 | 显示全部楼层
发一个源程序嘛..........顶!
回复

使用道具 举报

发表于 2007-3-6 17:42:36 | 显示全部楼层
发上来看看吧,不错的东西。
回复

使用道具 举报

发表于 2007-3-6 20:38:36 | 显示全部楼层
F11的提示信息中文显示,应该采用在文本模式下,替换ASCII字符集的高位字符(ASCII值为128~255)中不常用字符的字模的方式。

这样做,既不改变屏幕的显示模式,又不影响当前屏其它文字内容的正常显示,同时还能保留当前显示模式的所有特效,如高亮、闪烁、反白等一系列效果。还能做出左右两半汉字分别使用不同颜色和其它特效的效果。

这个方法的一个最大缺点,就是同屏显示的不同汉字的个数是相当有限的,不过对F11这样的要求来说已经足够了。
回复

使用道具 举报

发表于 2007-3-7 11:18:26 | 显示全部楼层
晕晕@@@@@@@@@@@@@@
回复

使用道具 举报

发表于 2007-3-7 23:48:14 | 显示全部楼层
你厉害,源代码都有,csdn转的?
回复

使用道具 举报

发表于 2007-3-9 09:32:53 | 显示全部楼层
不错,支持一下,继续观望
回复

使用道具 举报

发表于 2007-3-11 22:48:25 | 显示全部楼层
看来 F11 中文提示 还有人感兴趣,


  就是 看着 DOWNLOAD 没办法,


  人家有东东,我付费 都不共享
回复

使用道具 举报

发表于 2007-3-13 18:51:59 | 显示全部楼层
回复

使用道具 举报

发表于 2007-6-1 17:23:53 | 显示全部楼层
能不能把F11中文提示生成器传上来啊
回复

使用道具 举报

发表于 2007-6-1 18:21:54 | 显示全部楼层
不是酱紫做的,MBR运行时还没进入DOS,根本不可能调用DOS的文件功能来读取字库文件,唯一的办法就是预先把预定的字库数据放到MBR里面(每个汉字16/8*8=16字节),另外计算机里面的英文集好像是9*7格式的,会造成没法对齐,所以必须读取ASC16的字库(每个英文8/8*8=8字节),MBR里面的一些AA55标志、四大主分区数据也不能动,所以区区的1个扇区肯定不够(GRUB占了8个好象)。
回复

使用道具 举报

发表于 2007-6-1 19:28:04 | 显示全部楼层
支持一下。。。。。。。。。。!
回复

使用道具 举报

发表于 2007-6-2 08:18:54 | 显示全部楼层
厉害啊!!!!!!!!!
回复

使用道具 举报

发表于 2007-6-2 14:34:11 | 显示全部楼层
发上来看看吧,不错的东西。
回复

使用道具 举报

发表于 2007-6-4 09:53:00 | 显示全部楼层
何必那么麻烦呢?楼主写一个能读取并显示图片的引导器就行了嘛。。。。:lol
不过,还是得学习一下,原创的内容:lol
回复

使用道具 举报

发表于 2007-6-4 10:31:28 | 显示全部楼层
我以前在采集的时候,用UCDOS也经常有问题(UCDOS用足了定时中断*_*),后来也像楼上的一样干脆直接读图片。
回复

使用道具 举报

发表于 2007-6-4 12:19:24 | 显示全部楼层
支持!学习:D
回复

使用道具 举报

发表于 2007-6-4 12:34:45 | 显示全部楼层
支持,学习!
回复

使用道具 举报

发表于 2007-6-4 12:49:12 | 显示全部楼层
原帖由 弄潮儿-NET 于 2007-6-4 12:34 PM 发表
支持,学习!

技术区灌水?拉出去,XXX!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-4-10 05:31

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表