📄 han.cpp
字号:
/*******************************************************************************
模 块: 写汉字模块.
功 能: 采用内存字库,能显示中文和西文.
程序员: 雷中南.
版 本: v1.1
时 间: 1999-05-08
*******************************************************************************/
#include <io.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <graphics.h>
#include "def.h"
#include "han.h"
//构造函数.
Han::Han()
{
//汉字颜色.
Color = 15;
//背景颜色.
BkColor = 0;
//是否透明.
IsTransport = L_OK;
//汉字间距.
Distance = 0;
strcpy(HZK_FontFile, ".\\Fonts\\hzk16");
strcpy(ASC_FontFile, ".\\Fonts\\asc16");
//建立内存缓冲.
HZK = new FileIO();
//将字库放入内存.
PutToMem();
}
void
Han::Out(int Left, int Top, char *p)
{
//汉字位置.
int X, Y;
X = Left;
Y = Top;
unsigned int num,QM,WM,flag=0;
int record,i,j,k;
long pointer;
char Bit[32];//一个汉字的点阵.
while((num=*p++) != 0)
{
if(num>0xA1)//汉字标志.
{
if(flag == 0)//第一个字符.
{
//获得区码.
QM=(num-0xA1)&0x07F;
flag=1;
}
else//第二个字符.
{
//获得位码.
WM=(num-0xA1)&0x07F;
flag=0;
record=QM*94+WM;//获得记录指针.
pointer=record*32L;//获得文件位置指针.
if(HZK->Read((char *)Bit, pointer, 32)==L_ERROR)//读字库.
{
printf("\007");
}
if(IsTransport == L_ERROR)
{
setfillstyle(SOLID_FILL, BkColor);
bar(X, Y, X + 15, Y + 15);
}
for(i=0;i<16;i++)//将点阵按规则写屏.
for(j=0;j<2;j++)
for(k=0;k<8;k++)
if((Bit[i*2+j]>>(7-k))&0x01)
putpixel(X+j*8+k,Y+i,Color);//写屏.
X=X+Distance+16;//将写字位置移到下一个位置.
}
}
else//如果是西文.
{
if(IsTransport == L_ERROR)
{
setfillstyle(SOLID_FILL, BkColor);
bar(X, Y, X + 7, Y + 15);
}
record=num;
pointer=record*16L;//获得西文文件位置指针.
ReadASC((char *)Bit, (int)pointer);//读字库.
//按规则将点阵写屏.
for(i=0;i<16;i++)
for(k=0;k<8;k++)
if((Bit[i]>>(7-k))&0x01)
putpixel(X+k, Y+i, Color);//写屏.
X=X+Distance+8;//将写字位置移到下一个位置.
}
}
}
//析构函数.
Han::~Han()
{
//释放内存缓冲.
delete HZK;
}
//将字库放入内存.
void
Han::PutToMem()
{
int File;//文件句柄.
long Position;//文件指针.
int ReadSize;//一次读取的尺寸.
char *Data;
//给临时字符串分配内存.
Data=new char[16384];
//打开16点阵中文字库.
if((File = open(HZK_FontFile,O_RDONLY|O_BINARY)) == -1)
{
//如果打开失败,还是退出的好.
printf("\007Font file open fail!");
exit(1);
}
//将指针移到文件头.
lseek(File, 0, SEEK_SET);
do
{
//先将字库从文件中读出来.
Position = tell(File);
ReadSize = read(File,Data,16384);
//调用FileIO类中的函数将字库写入内存文件.
HZK->Write(Data, Position, ReadSize);
}while(ReadSize >= 16384);
close(File);
//打开16点阵西文字库.
if((File = open(ASC_FontFile,O_RDONLY|O_BINARY)) == -1)
{
//如果打开失败,还是退出的好.
printf("\007Font file open fail!");
exit(1);
}
//将指针移到文件头.
lseek(File, 0, SEEK_SET);
//先将字库从文件中读出来.
ReadSize = read(File, Data, 4096);
memcpy(ASC, Data, 4096);
close(File);
delete []Data;
}
void Han::ReadASC(char *buf, int position)
{
char *temp;
temp = ASC;
temp = temp + position;
memcpy(buf, temp, 16);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -