vb课程设计实验报告显示区位点阵汉字.docx
- 文档编号:9201416
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:15
- 大小:205.18KB
vb课程设计实验报告显示区位点阵汉字.docx
《vb课程设计实验报告显示区位点阵汉字.docx》由会员分享,可在线阅读,更多相关《vb课程设计实验报告显示区位点阵汉字.docx(15页珍藏版)》请在冰点文库上搜索。
vb课程设计实验报告显示区位点阵汉字
编程语言课程设计
显示区位点阵汉字
实验报告
班级:
姓名:
学号:
********大学实验报告
学年—学年第学期实习实验报告
姓名:
学号:
班级:
专业:
任课教师:
实验题目:
显示区位点阵汉字
实验环境:
visualbasic6.0
实验介绍:
计算机之所以能够显示和打印汉字,是因为计算机中有保存汉字笔划信息的字库文件。
一笔划的不同保存形式,分为点阵字库和矢量字库。
本题目要求编制一个程序,从附带的点阵字库文件hzk16中读取汉字的点阵信息并将汉字以区位码的顺序显示在窗口中。
实验目的:
熟悉并掌握、应用VB知识:
绘图、二进制文件的读取、按位逻辑运算以及自定义坐标系统。
实验要求:
(1)设计如图1所示的程序界面。
窗口中94个方格用来显示一个区中的94个汉字。
(2)程序启动后自动显示第一区汉字。
若在窗口上方的“区码”文本框中指定一区(1~87)后单击“显示”按钮,显示区则显示指定区中的汉字。
如果指定的区码不在1和87之间,则显示图2所示提示信息。
(3)用鼠标单击一个方格时,在“区位码”文本框中显示该汉字的区位码。
如图3所示,单击第一个方格’啊’字,“区位码”中显示数字为“1601”,表示“啊”字位于区位码表中第16区第1位。
如果单击方格外面的区域以及每个区中最后一竖行区域时,“区位码”文本框必须清空。
图1
在区码为1时单击“上一区”按钮,出现如图2所示提示信息:
图2
图3
实验难点:
(1)国家标准GB2312-80将国标汉字分为94个区,每区有94个位,总共可以为94*94=8836个汉字编码。
一个汉字可以用一个区位码唯一确定,如“啊”字的区位码为1601,表示它是第16区的第1位上的字符。
(2)本题目提供的点阵汉字库文件“hzk16”为16点阵汉字库,即一个汉字由16*16=256个点表示。
一个汉字的点阵信息由32个字节就可以表示,这32个字节的划分是由左到右、从上到下依次为字节0、字节1、字节2……字节31.
每个字节的8个位所代表点的位置是从左到右依次为:
b7、b6、……b0,在把汉字写到屏幕上时要特别注意这个顺序。
(4)知道了16点阵汉字库文件的结构之后,如果给定一个汉字的区位码,如何从字库中读出这个字的点阵信息(32个字节),再把点阵信息还原为屏幕上的文字是关键。
首先,根据区位码确定这个字在字库文件中的位置。
假设一个汉字的区码为m,位码为n,则这个字的点阵信息是位于从第((m-1)*94+n-1)*32+1个字节开始的连续32个字节上。
使用二进制方式打开文件hzk16,把这32个字节读到一个有32个元素的byte类型的数组zw中。
然后从一个字节中得到某一位是1还是0.这要用到按位逻辑运算。
假设字节型变量byte1中保存的是一个字节上8个点的点阵信息,想知道第n位上是1还是0,只需进行以下运算:
byte1And2^n.如果表达式的值为0,可以认为这一位是0,否则是1.
最后,根据32个字节每一位上的值,在窗体上的适当位置使用Pset方法画点(1画,0不画)。
(5)将窗体的Scalemode属性设置为3,使用像素为单位的标准坐标系统。
实验成果展示:
1、启动程序界面:
2、在“区码”内输入数字“10”,单击“显示”按钮:
3、单击“上一区”按钮:
4、单击“下一区”按钮:
5、在“区码”为“10”,单击其中的字符“B”,则对应的“区位码”显示出相应区位码位置:
6、在“区码”为“10”,单击其中的字符“H”,则对应的“区位码”显示为空:
7、显示一些特殊的区位页面:
实验代码:
Dimzw(31)AsByte'byte型一维数组
DimzsAsInteger
PrivateSubCommand1_Click()'显示
DimlocationAsLong
DimkAsInteger
DimqAsInteger
DimIAsInteger
DimjAsInteger
Dimx1AsInteger
Dimy1AsInteger
Dimz1AsInteger
Picture1.Scale(0,0)-(192*zs,192*zs)'16*12,四周各空出一个16*zs大小的空间
Picture1.ForeColor=vbRed
qm=Text1.Text
Ifqm<1Orqm>87Then
MsgBox"区码应在1和87之间!
",vbInformation,"区码"
'Text1.Text=qm0
EndIf
Picture1.Cls'清除之前区的图形,避免重叠
Fork=16*zsTo80*zsStep16*zs'176=16*11画出11条竖线
Picture1.Line(k,16*zs)-(k,176*zs),RGB(255,0,0)
Next
Fork=96*zsTo176*zsStep16*zs'176=16*11画出11条竖线
Picture1.Line(k,16*zs)-(k,160*zs),RGB(255,0,0)
Next
Forq=16*zsTo160*zsStep16*zs'画出11条横线
Picture1.Line(16*zs,q)-(176*zs,q),RGB(255,0,0)
Next
Picture1.Line(16*zs,176*zs)-(80*zs,176*zs),RGB(255,0,0)
ForI=1To10
Picture1.CurrentX=16*zs*I+5*zs'当前点的横坐标
Picture1.CurrentY=8*zs'当前点的纵坐标
Picture1.PrintI'在窗体或图片框上显示文本,使用Print方法,输出上方数字1~10
Next
ForI=1To10'输出左边数字0~90
Picture1.CurrentX=5*zs
Picture1.CurrentY=16*zs*I+8*zs
Picture1.Print10*I-10
Next
HzFile=App.Path+"\"+"hzk16"
OpenHzFileForBinaryAccessReadAs#1'读取汉字库中的原始字模
Forwm=1To94
IfwmMod10=1Then
y0=(wm\10+1)*16*zs+2*zs'每一行最左端的起始纵坐标
x0=16*zs+2*zs'每一行最左端的起始横坐标
EndIf
location=((qm-1)*94+wm-1)*32+1'汉字点阵信息在字库文件中开始的位置(连续32各字节)
Get#1,location,zw
Forx1=0To15
Fory1=0To1
Forz1=0To7
Ifzw(x1*2+y1)And2^(7-z1)Then
Picture1.PSet(y1*8+z1+x0+((wm-1)Mod10)*16*zs,x1+y0),
RGB(0,0,0)
'y1+8:
每一行从第二个字节的第一位开始;
'+z1:
遍历一个字节的0~7位点阵信息
'x1+y0:
纵坐标变化
EndIf
Next
Next
Next
Next
Close#1
EndSub
PrivateSubCommand2_Click()'上一区
IfText1.Text<=1OrText1.Text>87Then
MsgBox"区码应在1和87之间!
",vbInformation,"区码"
ExitSub
EndIf
Text1.Text=Text1.Text-1'这句如果放置于前面,则如果数字小于1,系统会出现崩溃
CallCommand1_Click'调用该过程
EndSub
PrivateSubCommand3_Click()'下一区
Text1.Text=Text1.Text+1
IfText1.Text<1OrText1.Text>87Then
MsgBox"区码应在1和87之间!
",vbInformation,"区码"
EndIf
CallCommand1_Click
EndSub
PrivateSubCommand4_Click()'区位码
If(X>=16*zsAndX<=176*zsAndY>=16*zsAndY<=176*zs)Or
(X>=16*zsAndX<=80*zsAndY>=160*zsAndY<=176*zs)Then
Picture1.FontItalic=True
Picture1.Print""
EndIf
EndSub
PrivateSubForm_Load()
zs=2
Text1.Text=1
Picture1.BackColor=vbWhite
Timer1.Interval=2
EndSub
PrivateSubPicture1_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
If(X>=16*zsAndX<=160*zsAndY>=16*zsAndY<=160*zs)Or(X>=16*zsAndX<=80*zsAndY>=160*zsAndY<=176*zs)Then
k=X\(16*zs)
q=(Y\(16*zs)-1)*10
wm1=k+q
qm2=Val(Text1.Text)
Text2.Text=Format(qm2,"00")&Format(wm1,"00")'格式输出函数:
指定输出格式
Else
Text2.Text=""
EndIf
EndSub
PrivateSubTimer1_Timer()
CallCommand1_Click
Timer1.Enabled=False
EndSub
实验过程中出现的问题及解决方法:
略
实验提高:
改变字体大小:
添加一个文本框,用来设置字体的大小,根据输入的数值,可放大缩小字体。
在定义坐标时,是:
picture1.Scale(0,0)-(192*zs,192*zs),
在画线时以16*zs为单位,
在画点时:
Picture1.PSet(y1*8+z1+x0+((wm-1)Mod10)*16*zs,x1+y0),
因此,让新添加的文本框的数值与zs对应,可改变字体大小,只需在源程序基础
上添加如下代码即可。
PrivateSubCommand1_Click()
IfText3.Text>0Then
zs=Text3.Text
Else
MsgBox"r0必须大于0!
"
EndIf
成果展示:
实验心得:
略
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- vb 课程设计 实验 报告 显示 区位 点阵 汉字
![提示](https://static.bingdoc.com/images/bang_tan.gif)