汉字通过字模用点阵显示的问题(附代码),达人们请帮忙看一下
lgytj 2003-11-06 09:18:16 我用Vb写了个读取字模点阵显示汉字的程序,但显示出来的汉字很奇怪,不正确,我用的是ucdos的hzk16字模。下面是程序,请帮忙看一下
/////////////////////////////////
Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long
Dim TempFile As String
Private Sub CmdCnt_Click()
Dim TempSrcFile As String
Dim TempDestFile As String
Dim HzFile As String
Dim To61202(32) As Integer
Dim p(1 To 2) As Byte
Dim C1, C2
Dim rec As Integer
Dim Location As Long '汉字在字库中的位置
Dim Hz(0 To 31) As Byte '转换完的32字节的字模数据
Dim HzAll() As Byte '存放全部字模数据的动态数组
Dim LoopAll As Integer
Dim bit, k2, k3 As Byte
Dim i, j, i1, k, k1, k4, k5, k6 As Integer
Dim i2, i3, i4, HzChar As Integer
Dim CharTo2 As String
Dim HzCol%, HzRow%
Form1.Cls
DestTxt.Text = "" 'DestTxt是目标文本框,存放转换后的16进制数据
Flag = 0
TempDestFile$ = App.Path + "\" + "TempDest.txt"
If SrcTxt.Text = "" Then '汉字输入框内无汉字则退出
MsgBox "没有可以转换的字模源文件!"
Exit Sub
End If
HzNum = Len(SrcTxt.Text) '获得汉字的个数
ReDim HzAll(0 To HzNum * 32 - 1) '重新定义动态数组的上界
Open TempFile For Output As #1
Print #1, SrcTxt.Text
Close #1
For LoopAll = 0 To HzNum - 1
Open TempFile For Binary Access Read As #1 '按二进制方式打开
Get #1, 2 * LoopAll + 1, p
Close #1
C1 = CStr(p(1)) - &HA1 '区内码
C2 = CStr(p(2)) - &HA1 '位内码
rec = C1 * 94 + C2
Location = CLng(rec) * 32 + 1 '该汉字在16*16点阵字库中字模第一个字节的位置
HzFile = App.Path + "\" + "hzk16.txt"
Open HzFile For Binary Access Read As #1 '读取该汉字在16点阵字库中的原始字模
Get #1, Location, Hz
Close #1
''''''''''''''''''''''''''''''''''
HzCol% = Form1.ScaleLeft
HzRow% = 0
For i4 = 0 To 15 '字模垂直方向16行点
For i2 = 0 To 1 '每行16个点对应的两个字节
'HzChar = Asc(Mid$(Hz, i4 * 2 + i2 + 1, 1)) '每个字节的ASCII值
HzChar = Asc(Hz(i4 * 2 + i2))
CharTo2 = Ten2Two(HzChar) '转为二进制(字符串格式)
For i3 = 0 To 7 '每个字节的8位
'If (HzChar(2 & (7 - i3))) And &H1 Then '若该位是1
If (Val(Mid(CharTo2, i3 + 1, 1))) And &H1 Then '若该位是1
Form1.PSet ((i2 * 8 + i3) * 100, i4 * 100), RGB(Red, 0, 0)
End If
Next i3
Next i2
Next i4
HzCol% = HzCol% + 16 '将光标置于下一个字符的左上角
Next LoopAll
Open TempDestFile For Binary Access Write As #1 '转换结果保存到TempDestFile中
Put #1, 1, HzAll
Close #1
MsgBox "OK!"
End Sub
Private Sub Form_Load()
Dim LocaleID As Long
LocalID = GetSystemDefaultLCID
TempFile = App.Path + "\" + "TempSrc.txt"
End Sub
Private Sub SrcTxt_Change()
Static SStr As String
Dim LocaleID As Long
LocalID = GetSystemDefaultLCID
Dim i As Integer
' Dim TempFile, TempFileBinary As String
Dim TempFileBinary As String
TotalNum = 0
l = Len(SrcTxt.Text)
For i = 1 To l
'tmpStr = StrConv(Mid$(SrcTxt.Text, i, 1),vbWide, 2052)
If Asc(Mid$(SrcTxt.Text, i, 1)) < 0 Then
TotalNum = TotalNum + 1
SStr = SrcTxt.Text
Else
MsgBox "写入的不是汉字!"
SrcTxt.Text = Left(SrcTxt.Text, Len(SrcTxt.Text) - 1)
Exit Sub
End If
Next i
LblNum.Caption = Str$(TotalNum) + "个汉字"
'TempFileBinary = App.Path + "\" + "TempSrcBinary.txt"
Open TempFile For Output As #1
Print #1, SrcTxt.Text
Close #1
End Sub
Public Function Ten2Two(ByVal varNum As Integer)
'将十进制数转化为定长8位的二进制串
'输入参数可以为&h类的十六进制
Dim returnString As String, ModNum As Integer
If varNum > 0 Then
Do While varNum > 0
ModNum = varNum Mod 16
varNum = Fix(varNum / 16)
returnString = Trim(Str(ModNum)) + returnString
Loop
Dim i As Integer
For i = 1 To 8 - Len(returnString)
'不足8位时,在前面补上0
returnString = 0 & returnString
Next
Ten2Two = returnString
ElseIf varNum < 0 Then
Do While Abs(varNum) > 0
ModNum = Abs(varNum) Mod 16
varNum = Fix(varNum / 16)
returnString = Trim(Str(ModNum)) + returnString
Loop
Dim j As Integer
For j = 1 To 8 - Len(returnString) - 1
'不足8位时,在前面补上0
returnString = 0 & returnString
Next
Ten2Two = 1 & returnString
End If
End Function