点阵汉字显示软件文档
一、 软件需求说明
当前针式打印机采用24针进行字符打印,字符点阵采用24×24的排列方式,用72个字节来保存。将所有字符的点阵数据按一定的秩序排列在一起就形成了点阵字库。为了对字库中所保存的字模进行可视化浏览,以设计出更好的打印方式,特设计一个点阵汉字显示工具。
此工具至少需要满足以下需求:
1、 能够根据汉字的通讯码定位到相应字库中的字模位置,并能得出相对偏移量
2、 能够对字库进行分页浏览,并可以利用鼠标与键盘进行相应字符的定位
3、 对选定的字符能够进行放大显示,以更清楚地查看其点阵排列方式
4、 对选定的字符能够查看其16进制行列扫描方式
5、 既能对行扫描方式保存的字库正常显示,也能对列扫描方式保存的字库正常显示 二、 软件开发平台
操作系统:WinXP
开发平台:VC++6.0
三、 软件处理流程图
编码输入中文输入索引输入鼠标选择键盘选择
编码验证获取编码索引验证字符定位字符定位
编码计算索引位置计算索引
合法索引
页面定位
取消原有选定字是=当前页面,否显示新页面符
选定字符选定字符
放大显示放大显示
四、系统界面
系统界面分为三个主要部分:
1、 字库浏览区:将字库进行分页显示,每页显示为16×18个字符,提供按钮和用户输入
页数进行页面的选择,也可以用键盘控制进行页面选择,PageUp(向上翻面),
PageDown(向下翻页),Home(定位首页),End(定位末页),可以用鼠标在页面上单击来
选定字符。同时系统提供行列两种扫描方式,以满足不同字库扫描方式的需求。 2、 当前选定字符浏览区:在点阵显示区将当前选定的字符进行放大显示,默认放大7倍显
示,可以通过滑块进行放大倍数选择(4~11倍),也可用小键盘上的‘+’ 与‘-’进行放大
与缩小显示,最大可以全屏显示字符的点阵排列方式。在十六进制点阵区域的两个文本
框中显示字符的十六进制行扫描方式与列扫描方式。对于点阵中每个点的图案有两种可
选的图形,圆形与方形,用户可能随时进行切换显示。
3、 用户与系统交互区:用户可以在此区域选择点阵字库和输入方式,并输入相应的内容,
系统会自动对输入内容进行验证并定位到相应页面中的字符处。提供按钮进行字符的定
位,也可以通过键盘上的上、下、左、右键来定位字符。可以随时设置字符的前景与背
景颜色,也可以重新打开新的字库文件。
五、相关类介绍
系统采用MFC中基于对话框的应用程序实现,主要包括以下四个类:
CDianzhenDlg:点阵对话框类,主要功能全部在此类实现
CFullScreenDlg:用来全屏显示单个字符的点阵排列方式
CDianzhenApp:应用程序类,此类主要用来响应一些键盘按键处理
CAboutDlg:关于对话类,用来介绍软件的一些相关信息
CFullScreenDlg,CDianzhenApp,CAboutDlg这三个类相对来说比较简单,就不作详细介绍了。软件功能的主要实现函数都是在CDianzhenDlg类中完成的,所以下面着重介绍CDianzhenDlg类的相关内容。
CDianzhenDlg类是软件中最主要的类,所有的功能函数和相关变量都是在此类中定义
的,如分页显示函数,字符定位函数,字符放大显示函数,索引计算函数等。下面详细列举
出了其中的成员变量和相关函数的介绍说明:
宏定义部分:
#define ROWNUM 16 /*每面每行字符数*/ #define COLNUM 18 /*每面每列字符数*/ #define PAGENUM (ROWNUM*COLNUM) /*每面总字符数*/ #define DZ_NUM 72 /*保存一个点阵字符所需要的字节数量*/ #define X_PAGE_START 35 /*整屏点阵显示的起始X座标*/ #define Y_PAGE_START 30 /*整屏点阵显示的起始Y座标*/ #define MAX_FONT 11 /*字符最大放大倍数*/
#define MIN_FONT 4 /*字符最小放大倍数*/
/*以下四个宏定义来自于打印机驱动程序中的cn_code.c*/ #define FOUR_82_2_POS (long)(4*1260+(0x0eb-0x81)*10)
#define FOUR_82_3_POS (long)(FOUR_82_2_POS+90)
#define FOUR_82_4_POS (long)(FOUR_82_3_POS+90)
#define FOUR_END_POS (long)(FOUR_82_4_POS+90)
成员变量定义部分:
CString m_fileName; //字库文件名字
FILE * m_pFile; //保存打开字库文件的文件指针
CBrush m_dotBrush; //保存用有点颜色建立的画刷
CBrush m_notDotBrush; //保存用无点颜色建立的画刷
COLORREF m_dotColor; //保存有点颜色
COLORREF m_ndotColor; //保存无点颜色
byte m_buf[DZ_NUM]; //用来保存当前所选字符的点阵数据
byte m_destBuf[DZ_NUM]; //用来保存当前所选字符行列转换后的点阵数据
byte m_bufArr[PAGENUM][DZ_NUM]; //保存一页字符
int m_dotSize; //点大小
int X_START; //显示单个点阵字符时的x座标
int Y_START; //显示单个点阵字符时的y座标
int m_maxPage; //最大页数
int m_maxIndex; //最后字符索引
int m_xpos; //用来保存当前选择字符的x座标
int m_ypos; //用来保存当前选择字符的y座标
CFullScreenDlg fsDlg; //用来全屏显示点阵字符的对话框
int m_numPage; //保存当前页码
int m_codeType; //保存当前编码类型:暂时只对gb18030码进行处理
int m_scanType; //保存当前扫描方式
CSliderCtrl m_numEnlarge; //字符显示大小控制滑块
CEdit m_dzHexH; //显示当前所选字符的16进制行扫描点阵方式
CEdit m_dzHexV; //显示当前所选字符的16进制列扫描点阵方式
int m_input; //用来保存当前所选字符索引
CString m_code; //获取用户输入
int m_inputKind; //保存输入方式
int m_numPage; //保存当前页码
int m_codeType; //保存当前编码方式
int m_scanType; //保存当前扫描方式
int m_dotType; //保存当前绘制的点的类型
函数声明部分:
int getIntByChar(char c); //将0-9,A-F字符转变为相应的10进制整数
void DoPrePage(); //前一页
void DoNextPage(); //后一页
void DoFirstPage(); //首页
void DoLastPage(); //末页
void DoBtnPrevious(); //向左箭头(前一个字)
void DoBtnNext(); //向右箭头(后一个字)
void DoBtnUp(); //向上箭头(上一行正上方的字)
void DoBtnDown(); //向下箭箭(下一行正下方的字)
void DoSlidEnlarge(bool isLarge); //用'+','-'控制点字符放大与缩小所调用的函数
/*****************************************************************
description:根据字符索引选择当前字符并放大显示
firstColor:字符前景颜色
secondColor:字符背景颜色
******************************************************************/
void SelByIndex(COLORREF &firstColor,COLORREF &secondColor);
/*****************************************************************
description:将以字节保存的点阵字符转变为16进制的方式保存
buf:输入点阵
str:保存点阵的16进制
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
形式
******************************************************************/
void GetStr16FromByteArr(byte buf[DZ_NUM],CString& str);
/*****************************************************************
description:将字符点阵扫描方式进行行列转换
srcBuf:输入点阵
destBuf:输出点阵
******************************************************************/
void FromColtoRow(const byte *srcBuf,byte *destBuf);
/*****************************************************************
description:由字符索引来获取字符编码(此函数已废弃不用)
index:字符索引
buf:字符编码
******************************************************************/
void GetCodeByIndex(int index,char* buf);
/*****************************************************************
description:在页面上重绘一个字符
x:起始x座标
y:起始y座标
buf:存放点阵的字节数组
dc:绘图设备
len:给制点的大小
dotCol:有点的颜色
notDotCol:没有点的颜色
isDolScan:行列扫描方式
******************************************************************/
void SmallFontDislpay(int x,int y,byte* buf,CDC *dc,
int len,COLORREF& dotCol,COLORREF& notDotCol,int isColScan = 0);
/*****************************************************************
description:在点阵显示区打印一个字
x:起始x座标
y:起始y座标
buf:存放点阵的字节数组
dc:绘图设备
len:给制点的大小
dotBrush:有点的颜色所构建出来的画刷
noDotBrush:无点的颜色所构建出来的画刷
isDolScan:行列扫描方式
******************************************************************/
void FontDisPlay(int x,int y,byte *buf,CDC *dc,
int len,CBrush& dotBrush,CBrush& noDotBrush,int isColScan = 0);
/*****************************************************************
description:显示一页,此函数调用SmallFontDislpay来绘制一个个字符
x:起始x座标
y:起始y座标
buf:存放点阵的字节数组
dc:绘图设备
len:给制点的大小
dotCol:有点的颜色
notDotCo:没有点的颜色
isDolScan:行列扫描方式
******************************************************************/
void FontArrDisPlay(int x,int y,byte bufArr[PAGENUM][DZ_NUM],CDC *dc,
int len,COLORREF& dotCol,COLORREF& notDotCol,int isColScan = 0);
/*****************************************************************
description:根据页码显示一页,具体显示方式由FontArrDisplay来实现
pageIndex::输入页面
******************************************************************/
void PrintPage(int pageIndex);
/*****************************************************************
description:在(left,top,right,bottom)所指定的区域绘制一个相应的图形
dc:绘图设备
left,top,right,bottom:指定绘制区域
dotType:绘制的图形类型
******************************************************************/
void DrawDot(CDC *pdc,int left,int top,int right,int bottom,int dotType);
/*****************************************************************
description:四字节字符偏移量的计算
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
c1,c2,c3,c4:汉字的四个字节
return:字符在字库的索引位置
******************************************************************/
unsigned short FourBytePro(unsigned short c1,unsigned short c2,unsigned short
c3,unsigned short c4);
//重写基类的两个虚函数,以免按下回车或ESC键程序自动退出
void OnOK();
void OnCancel();
六、主要功能实现以及相应的代码
1、整页字符显示:每次更新页面的时候都会调用函数PrintPage(int pageIndex),它调用
FontArrDisPlay()函数读入一页字符大小,并按16×18显示在页面指定的区域,其中单个字
符的绘制由函数SmallFontDislpay完成。
//根据页面索引显示一页
void CDianzhenDlg::PrintPage(int pageIndex)
{
memset(m_bufArr,0,sizeof(m_bufArr));
fseek(m_pFile,DZ_NUM*pageIndex*PAGENUM,SEEK_SET);
fread(m_bufArr,1,DZ_NUM*PAGENUM,m_pFile);
/**************利用双缓冲技术来显示页面***************/
//创建兼容DC
CDC memDC;
memDC.CreateCompatibleDC(GetDC());
//设置内存绘制区域
CBitmap pageFace;
pageFace.CreateCompatibleBitmap(GetDC(),ROWNUM * 25+1,COLNUM * 25+1);
memDC.SelectObject(&pageFace);
//在内存区域上绘制图象
FontArrDisPlay(1, 1, m_bufArr,&memDC,1,m_dotColor,m_ndotColor,m_scanType);
//将内存图像拷贝到显示位置上
GetDC()->BitBlt(X_PAGE_START-6,Y_PAGE_START+4,ROWNUM*25+1,COLNUM*25+1,&memDC,0,
0,SRCCOPY);
}
void CDianzhenDlg::FontArrDisPlay(int x,int y,byte bufArr[PAGENUM][72],CDC *dc,
int len,COLORREF& dotCol,COLORREF& notDotCol,int isColScan) {
for(int i=0;i
0字
个人自传范文3000字为中华之崛起而读书的故事100字新时代好少年事迹1500字绑架的故事5000字个人自传范文2000字
符通讯码来定位到字库中的具体字的点阵上。
对于其他类型的字库,如BIG5与UNICODE点阵字库,由于没有提供编码与索引位置的对应关系,所以现在还不能通过通讯码来定位到相应的字符上去。但是只要是24×24点阵的字库,都可以通过系统进行查看。下一步可以对这些功能进行完善。