GDIVisual Basic 8 (2005)Visual Studio 2008Visual Studio 2005中级开发Visual StudioWindows.NETVisual Basic
EAN13 条形码控件






4.55/5 (16投票s)
演示使用 VB.NET 创建 EAN-13 条形码。
介绍
在 2005 年,我大部分的工作都与条形码相关的程序有关,因为我正在为带有集成条形码读器的手持设备编写程序。了解条形码技术以及第三方工具如何绘制这些条码令人兴奋。所以我开始寻找一些资源来理解用于生成条形码的算法。我发现了很多条形码类型,每种类型都有自己的算法。我的目标是创建我自己的条形码控件。
在 2006 年初,我开始使用这个 EAN13 条形码。之后,我暂停了,因为我发现了其他令人兴奋的技术。我知道 CodeProject 上有很多文章讨论 EAN 13 条形码,但我希望与你分享这个。
Using the Code
此函数初始化条形码表,我们将使用它来绘制条码。
Public Sub InitEAN13Tables()
' Zero
Tables(0).TableA = "0001101"
Tables(0).TableB = "0100111"
Tables(0).TableC = "1110010"
' One
Tables(1).TableA = "0011001"
Tables(1).TableB = "0110011"
Tables(1).TableC = "1100110"
' Two
Tables(2).TableA = "0010011"
Tables(2).TableB = "0011011"
Tables(2).TableC = "1101100"
' Three
Tables(3).TableA = "0111101"
Tables(3).TableB = "0100001"
Tables(3).TableC = "1000010"
' Four
Tables(4).TableA = "0100011"
Tables(4).TableB = "0011101"
Tables(4).TableC = "1011100"
' Five
Tables(5).TableA = "0110001"
Tables(5).TableB = "0111001"
Tables(5).TableC = "1001110"
' Six
Tables(6).TableA = "0101111"
Tables(6).TableB = "0000101"
Tables(6).TableC = "1010000"
' Seven
Tables(7).TableA = "0111011"
Tables(7).TableB = "0010001"
Tables(7).TableC = "1000100"
' Eight
Tables(8).TableA = "0110111"
Tables(8).TableB = "0001001"
Tables(8).TableC = "1001000"
' Nine
Tables(9).TableA = "0001011"
Tables(9).TableB = "0010111"
Tables(9).TableC = "1110100"
End Sub
函数 CalculateCheckSum
计算条形码的校验和码。
Private Function CalculateCheckSum() As Boolean
Dim X As Integer = 0
Dim Y As Integer = 0
Dim j As Integer = 11
Try
For i As Integer = 1 To 12
If i Mod 2 = 0 Then
X += Val(m_BarcodeText(j))
Else
Y += Val(m_BarcodeText(j))
End If
j -= 1
Next
Dim Z As Integer = X + (3 * Y)
'first way
m_CheckSum = ((10 - (Z Mod 10)) Mod 10)
'second way
'Dim M As Integer = Z
' Do Until (M Mod 10 = 0)
'M += 1
' Loop
'm_CheckSum = M - Z
Return True
Catch ex As Exception
MessageBox.Show(ex.Message)
Return False
End Try
End Function
CalculateValue
是主要函数,它根据条形码表计算条形码值。
Private Function CalculateValue() As Boolean
' Clear any previous Value
BarcodeValue = New StringBuilder(95)
Try
' Add The Start Mark
BarcodeValue.Append(StartMark)
Select Case m_BarcodeText(0)
Case "0"
For i As Integer = 1 To 6
BarcodeValue.Append(Tables(Val(m_BarcodeText(i))).TableA)
Next
Case "1"
For i As Integer = 1 To 6
If (i = 1) Or (i = 2) Or (i = 4) Then
BarcodeValue.Append(Tables(Val(m_BarcodeText(i))).TableA)
Else
BarcodeValue.Append(Tables(Val(m_BarcodeText(i))).TableB)
End If
Next
Case "2"
For i As Integer = 1 To 6
If (i = 1) Or (i = 2) Or (i = 5) Then
BarcodeValue.Append(Tables(Val(m_BarcodeText(i))).TableA)
Else
BarcodeValue.Append(Tables(Val(m_BarcodeText(i))).TableB)
End If
Next
Case "3"
For i As Integer = 1 To 6
If (i = 1) Or (i = 2) Or (i = 6) Then
BarcodeValue.Append(Tables(Val(m_BarcodeText(i))).TableA)
Else
BarcodeValue.Append(Tables(Val(m_BarcodeText(i))).TableB)
End If
Next
Case "4"
For i As Integer = 1 To 6
If (i = 1) Or (i = 3) Or (i = 4) Then
BarcodeValue.Append(Tables(Val(m_BarcodeText(i))).TableA)
Else
BarcodeValue.Append(Tables(Val(m_BarcodeText(i))).TableB)
End If
Next
Case "5"
For i As Integer = 1 To 6
If (i = 1) Or (i = 4) Or (i = 5) Then
BarcodeValue.Append(Tables(Val(m_BarcodeText(i))).TableA)
Else
BarcodeValue.Append(Tables(Val(m_BarcodeText(i))).TableB)
End If
Next
Case "6"
For i As Integer = 1 To 6
If (i = 1) Or (i = 5) Or (i = 6) Then
BarcodeValue.Append(Tables(Val(m_BarcodeText(i))).TableA)
Else
BarcodeValue.Append(Tables(Val(m_BarcodeText(i))).TableB)
End If
Next
Case "7"
For i As Integer = 1 To 6
If (i = 1) Or (i = 3) Or (i = 5) Then
BarcodeValue.Append(Tables(Val(m_BarcodeText(i))).TableA)
Else
BarcodeValue.Append(Tables(Val(m_BarcodeText(i))).TableB)
End If
Next
Case "8"
For i As Integer = 1 To 6
If (i = 1) Or (i = 3) Or (i = 6) Then
BarcodeValue.Append(Tables(Val(m_BarcodeText(i))).TableA)
Else
BarcodeValue.Append(Tables(Val(m_BarcodeText(i))).TableB)
End If
Next
Case "9"
For i As Integer = 1 To 6
If (i = 1) Or (i = 4) Or (i = 6) Then
BarcodeValue.Append(Tables(Val(m_BarcodeText(i))).TableA)
Else
BarcodeValue.Append(Tables(Val(m_BarcodeText(i))).TableB)
End If
Next
End Select
' Add The Splitting Mark
BarcodeValue.Append(SplittingMark)
For i As Integer = 7 To (m_BarcodeText.Length - 1)
BarcodeValue.Append(Tables(Val(m_BarcodeText(i))).TableC)
Next
' Add Checksum
BarcodeValue.Append(Tables(CheckSum).TableC)
' Add The End Mark
BarcodeValue.Append(EndMark)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Function
打印
在实际应用中,你需要打印条形码标签,以便在产品和物品上使用。我已经更新了控件以支持打印,你还可以显示/隐藏条码下方条码值。
关注点
这个条形码控件只是为了好玩而创建的,不是一个专业的控件。我们可以添加很多属性到它上面。我认为条码大小需要一些额外的处理,以便能够以不同的尺寸进行打印。也许如果我有时间,我会为其他条形码类型(如 pdf417)编写控件。
尽情享受 :)
更新日志
版本 0.1
- 初始发布
版本 0.2:
- 添加了在条形码下方显示条形码数字的功能
- 添加了条形码打印支持