vb课程设计实验报告显示区位点阵汉字.docx

上传人:b****0 文档编号:9201416 上传时间:2023-05-17 格式:DOCX 页数:15 大小:205.18KB
下载 相关 举报
vb课程设计实验报告显示区位点阵汉字.docx_第1页
第1页 / 共15页
vb课程设计实验报告显示区位点阵汉字.docx_第2页
第2页 / 共15页
vb课程设计实验报告显示区位点阵汉字.docx_第3页
第3页 / 共15页
vb课程设计实验报告显示区位点阵汉字.docx_第4页
第4页 / 共15页
vb课程设计实验报告显示区位点阵汉字.docx_第5页
第5页 / 共15页
vb课程设计实验报告显示区位点阵汉字.docx_第6页
第6页 / 共15页
vb课程设计实验报告显示区位点阵汉字.docx_第7页
第7页 / 共15页
vb课程设计实验报告显示区位点阵汉字.docx_第8页
第8页 / 共15页
vb课程设计实验报告显示区位点阵汉字.docx_第9页
第9页 / 共15页
vb课程设计实验报告显示区位点阵汉字.docx_第10页
第10页 / 共15页
vb课程设计实验报告显示区位点阵汉字.docx_第11页
第11页 / 共15页
vb课程设计实验报告显示区位点阵汉字.docx_第12页
第12页 / 共15页
vb课程设计实验报告显示区位点阵汉字.docx_第13页
第13页 / 共15页
vb课程设计实验报告显示区位点阵汉字.docx_第14页
第14页 / 共15页
vb课程设计实验报告显示区位点阵汉字.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

vb课程设计实验报告显示区位点阵汉字.docx

《vb课程设计实验报告显示区位点阵汉字.docx》由会员分享,可在线阅读,更多相关《vb课程设计实验报告显示区位点阵汉字.docx(15页珍藏版)》请在冰点文库上搜索。

vb课程设计实验报告显示区位点阵汉字.docx

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

成果展示:

实验心得:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2