- 生肖
- 蛇
- 性别
- 男
- 积分
- 208
- 积分
- 216
- 精华
- 0
- 阅读权限
- 30
- 注册时间
- 2012-4-28
- 最后登录
- 2012-6-1
- 帖子
- 30
- 生肖
- 蛇
- 性别
- 男
|
本帖最后由 sky_yx 于 2015-12-30 14:23 编辑
'CODE39码的编码规则是:
'1、每五条线表示一个字符;
'2、粗线表示1,细线表示0;
'3、线条间的间隙宽的表示1,窄的表示0;
'4、五条线加上它们之间的四条间隙就是九位二进制编码,而且这九位中必定有三位是1,所以称为39码;
'5、条形码的首尾各一个 * 标识开始和结束
- Public Sub PrintBarCode(ByVal strBarCode As String, _
- Optional ByVal intXPos As Integer = 0, _
- Optional ByVal intYPos As Integer = 0, _
- Optional ByVal intPrintHeight As Integer = 10, _
- Optional ByVal bolPrintText As Boolean = True)
- '参数说明:
- 'strBarCode -要打印的条形码字符串
- 'intXPos, intYPos - 打印条形码的左上角坐标(缺省为(0,0),坐标刻度为:毫米)
- 'intHeight - 打印高度(缺省为一厘米,坐标刻度为:毫米)
- 'bolPrintText -是否打印人工识别字符(缺省为true)
- '"0"-"9","A-Z","-","%","$"和"*" 的条码编码格式,总共 40 个字符
- Static strBarTable(39) As String
- '初始化条码编码格式表
- strBarTable(0) = "001100100" ' 0
- strBarTable(1) = "100010100" ' 1
- strBarTable(2) = "010010100" ' 2
- strBarTable(3) = "110000100" ' 3
- strBarTable(4) = "001010100" ' 4
- strBarTable(5) = "101000100" ' 5
- strBarTable(6) = "011000100" ' 6
- strBarTable(7) = "000110100" ' 7
- strBarTable(8) = "100100100" ' 8
- strBarTable(9) = "010100100" ' 9
- strBarTable(10) = "100010010" ' A
- strBarTable(11) = "010010010" ' B
- strBarTable(12) = "110000010" ' C
- strBarTable(13) = "001010010" ' D
- strBarTable(14) = "101000010" ' E
- strBarTable(15) = "011000010" ' F
- strBarTable(16) = "000110010" ' G
- strBarTable(17) = "100100010" ' H
- strBarTable(18) = "010100010" ' I
- strBarTable(19) = "001100010" ' J
- strBarTable(20) = "100010001" ' K
- strBarTable(21) = "010010001" ' L
- strBarTable(22) = "110000001" ' M
- strBarTable(23) = "001010001" ' N
- strBarTable(24) = "101000001" ' O
- strBarTable(25) = "011000001" ' P
- strBarTable(26) = "000110001" ' Q
- strBarTable(27) = "100100001" ' R
- strBarTable(28) = "010100001" ' S
- strBarTable(29) = "001100001" ' T
- strBarTable(30) = "100011000" ' U
- strBarTable(31) = "010011000" ' V
- strBarTable(32) = "110001000" ' W
- strBarTable(33) = "001011000" ' X
- strBarTable(34) = "101001000" ' Y
- strBarTable(35) = "011001000" ' Z
- strBarTable(36) = "000111000" ' -
- strBarTable(37) = "100101000" ' %
- strBarTable(38) = "010101000" ' $
- strBarTable(39) = "001101000" ' *
- If strBarCode = "" Then Exit Sub ' 不打印空串
- ' 保存打印机 ScaleMode
- Dim intOldScaleMode As ScaleModeConstants
- intOldScaleMode = Form1.ScaleMode
- ' 保存打印机 DrawWidth
- Dim intOldDrawWidth As Integer
- intOldDrawWidth = Form1.DrawWidth
- ' 保存打印机 Font
- Dim fntOldFont As StdFont
- Set fntOldFont = Form1.Font
- Form1.ScaleMode = vbTwips ' 设置打印用的坐标刻度为缇(twip=1)
- Form1.DrawWidth = 1 ' 线宽为 1
- Form1.FontName = "宋体" ' 打印在条码下方字符的字体和大小
- Form1.FontSize = 10
- Dim strBC As String ' 要打印的条码字符串
- strBC = UCase(strBarCode)
- ' 将以毫米表示的 X 坐标转换为以缇表示
- Dim x As Integer
- x = Form1.ScaleX(intXPos, vbMillimeters, vbTwips)
- ' 将以毫米表示的 Y 坐标转换为以缇表示
- Dim y As Integer
- y = Form1.ScaleY(intYPos, vbMillimeters, vbTwips)
- ' 将以毫米表示的高度转换为以缇表示
- Dim intHeight As Integer
- intHeight = Form1.ScaleY(intPrintHeight, vbMillimeters, vbTwips)
- ' 是否在条形码下方打印人工识别字符
- If bolPrintText = True Then
- ' 条码打印高度要减去下面的字符显示高度
- intHeight = intHeight - Form1.TextHeight(strBC)
- End If
- Const intWidthCU As Integer = 30 ' 粗线和宽间隙宽度
- Const intWidthXI As Integer = 10 ' 细线和窄间隙宽度
- Dim intIndex As Integer ' 当前处理的字符串索引
- Dim i As Integer, j As Integer, k As Integer ' 循环控制变量
- ' 添加起始字符
- If Left(strBC, 1) <> "*" Then
- strBC = "*" & strBC
- End If
- ' 添加结束字符
- If Right(strBC, 1) <> "*" Then
- strBC = strBC & "*"
- End If
- ' 循环处理每个要显示的条码字符
- For i = 1 To Len(strBC)
- ' 确定当前字符在 strBarTable 中的索引
- Select Case Mid(strBC, i, 1)
- Case "*"
- intIndex = 39
- Case "$"
- intIndex = 38
- Case "%"
- intIndex = 37
- Case "-"
- intIndex = 36
- Case "0" To "9"
- intIndex = CInt(Mid(strBC, i, 1))
- Case "A" To "Z"
- intIndex = Asc(Mid(strBC, i, 1)) - Asc("A") + 10
- Case Else
- MsgBox "要打印的条形码字符串中包含无效字符!当前版本只支持字符 '0-9,A-Z,-,%,$*"
- End Select
- ' 是否在条形码下方打印人工识别字符
- If bolPrintText = True Then
- Form1.CurrentX = x
- Form1.CurrentY = y + intHeight
- Form1.Print Mid(strBC, i, 1)
- End If
- For j = 1 To 5
- ' 画细线
- If Mid(strBarTable(intIndex), j, 1) = "0" Then
- For k = 0 To intWidthXI - 1
- Form1.Line (x + k, y)-Step(0, intHeight)
- Next k
- x = x + intWidthXI
- ' 画宽线
- Else
- For k = 0 To intWidthCU - 1
- Form1.Line (x + k, y)-Step(0, intHeight)
- Next k
- x = x + intWidthCU
- End If
- ' 每个字符条码之间为窄间隙
- If j = 5 Then
- x = x + intWidthXI * 3
- Exit For
- End If
- ' 窄间隙
- If Mid(strBarTable(intIndex), j + 5, 1) = "0" Then
- x = x + intWidthXI * 3
- ' 宽间隙
- Else
- x = x + intWidthCU * 2
- End If
- Next j
- Next i
- ' 恢复打印机 ScaleMode
- Form1.ScaleMode = intOldScaleMode
- ' 恢复打印机 DrawWidth
- Form1.DrawWidth = intOldDrawWidth
- ' 恢复打印机 Font
- Set Form1.Font = fntOldFont
- End Sub
复制代码
|
|