⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 han.cpp

📁 金融pos机前台源码
💻 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 + -