Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0040: Barcode39 mit .NET

 von 

Beschreibung

Der Barcode 39 ist ein Barcode welcher eine Reihe von 43 fest definierten Zeichen in 9 Balken pro Zeichen umwandelt. Dieses Beispiel, welches auch leicht an andere Barcodes anpassbar ist, zeichnet einen solchen Barcode in ein beliebiges Steuerelement.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Framework-Version(en):

.NET Framework 1.0, .NET Framework 1.1, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5

.NET-Version(en):

Visual Basic 2002, Visual Basic 2003, Visual Basic 2005, Visual Basic 2008

Download:

Download des Beispielprojektes [4,88 KB]

' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!

' Projektversion:   Visual Studio 2002/2003
' Option Strict:    Aus
' Option Explicit:  An
'
' Referenzen: 
'  - System
'  - System.Data
'  - System.Drawing
'  - System.Windows.Forms
'  - System.XML
'
' Imports: 
'  - Microsoft.VisualBasic
'  - System
'  - System.Collections
'  - System.Data
'  - System.Drawing
'  - System.Diagnostics
'  - System.Windows.Forms
'

' ##############################################################################
' ############################### Barcode39.vb #################################
' ##############################################################################
Public Class frmBarcode29
    Inherits System.Windows.Forms.Form


    Private Function MD_Barcode39(ByVal Barcode As String, _
        ByVal PaintObj As Object, _
        ByVal mLeft As Single, _
        ByVal mTop As Single, _
        ByVal mWidth As Single, _
        ByVal mHeight As Single)

        Const Nratio = 20, Wratio = 55, Qratio = 35

        Dim Nbar As Single, Wbar As Single, Qbar As Single, NextBar As Single
        Dim CountX As Single, CountY As Single, CountR As Single
        Dim Parts As Single, Pix As Single, BarCodePlus As String
        Dim Stripes As String, BarType As String
        Dim Mx As Single, [My] As Single, Sx As Single, Sy As Single

        Dim g As System.Drawing.Graphics
        Dim pB As New System.Drawing.SolidBrush(System.Drawing.Color.Black)
        Dim pW As New System.Drawing.SolidBrush(System.Drawing.Color.White)
        Dim color As System.Drawing.SolidBrush

        Try
            ' Get control size and location properties.
            Sx = mLeft
            Sy = mTop
            Mx = mWidth
            [My] = mHeight

            g = PaintObj.CreateGraphics()

            ' Calculate actual and relative pixels values.
            Parts = (Barcode.Length + 2) * _
                ((6 * Nratio) + (3 * Wratio) + (1 * Qratio))
            Pix = (Mx / Parts)
            Nbar = (20 * Pix) : Wbar = (55 * Pix) : Qbar = (35 * Pix)

            ' Initialize bar index and color.
            NextBar = Sx
            color = pW

            ' Pad each end of string with start/stop characters.
            BarCodePlus = "*" & Barcode.ToUpper & "*"

            ' Walk through each character of the barcode contents.
            For CountX = 0 To BarCodePlus.Length - 1
                ' Get Barcode 1/0 string for indexed character.
                Stripes = MD_BC39(BarCodePlus.Substring(CountX, 1))
                For CountY = 0 To 8
                    ' For each 1/0, draw a wide/narrow bar.
                    BarType = Stripes.Substring(CountY, 1)

                    'Toggle the color (black/white).
                    If color Is pW Then
                        color = pB
                    Else
                        color = pW
                    End If

                    Select Case BarType
                    Case "1"
                        ' Draw a wide bar.
                        g.FillRectangle(color, NextBar, Sy, _
                            Wbar + NextBar, [My] + Sy)
                        NextBar = NextBar + Wbar
                    Case "0"
                        ' Draw a narrow bar.
                        g.FillRectangle(color, NextBar, Sy, _
                            Nbar + NextBar, [My] + Sy)
                        NextBar = NextBar + Nbar
                    End Select
                Next CountY

                ' Toggle the color (black/white).
                If color Is pW Then
                    color = pB
                Else
                    color = pW
                End If

                ' Draw intermediate "quiet" bar.
                g.FillRectangle(color, NextBar, Sy, Qbar + NextBar, [My] + Sy)
                NextBar = NextBar + Qbar
            Next CountX
        Catch ex As Exception
            MessageBox.Show(ex.StackTrace)
        End Try
    End Function

    Function MD_BC39(ByVal CharCode As String) As String
        Try
            Dim BC39(90) As String

            BC39(32) = "011000100" ' space
            BC39(36) = "010101000" ' $
            BC39(37) = "000101010" ' %
            BC39(42) = "010010100" ' * Start/Stop
            BC39(43) = "010001010" ' +
            BC39(45) = "010000101" ' |
            BC39(46) = "110000100" ' .
            BC39(47) = "010100010" ' /
            BC39(48) = "000110100" ' 0
            BC39(49) = "100100001" ' 1
            BC39(50) = "001100001" ' 2
            BC39(51) = "101100000" ' 3
            BC39(52) = "000110001" ' 4
            BC39(53) = "100110000" ' 5
            BC39(54) = "001110000" ' 6
            BC39(55) = "000100101" ' 7
            BC39(56) = "100100100" ' 8
            BC39(57) = "001100100" ' 9
            BC39(65) = "100001001" ' A
            BC39(66) = "001001001" ' B
            BC39(67) = "101001000" ' C
            BC39(68) = "000011001" ' D
            BC39(69) = "100011000" ' E
            BC39(70) = "001011000" ' F
            BC39(71) = "000001101" ' G
            BC39(72) = "100001100" ' H
            BC39(73) = "001001100" ' I
            BC39(74) = "000011100" ' J
            BC39(75) = "100000011" ' K
            BC39(76) = "001000011" ' L
            BC39(77) = "101000010" ' M
            BC39(78) = "000010011" ' N
            BC39(79) = "100010010" ' O
            BC39(80) = "001010010" ' P
            BC39(81) = "000000111" ' Q
            BC39(82) = "100000110" ' R
            BC39(83) = "001000110" ' S
            BC39(84) = "000010110" ' T
            BC39(85) = "110000001" ' U
            BC39(86) = "011000001" ' V
            BC39(87) = "111000000" ' W
            BC39(88) = "010010001" ' X
            BC39(89) = "110010000" ' Y
            BC39(90) = "011010000" ' Z

            Return BC39(Asc(CharCode))
        Catch ex As Exception
            Return ""
        End Try
    End Function

    Private Sub txtString_TextChanged(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles txtString.TextChanged

        pnlCode.Refresh()
    End Sub

    Private Sub pnlCode_Paint(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.PaintEventArgs) Handles pnlCode.Paint

        MD_Barcode39(txtString.Text, pnlCode, 0, 0, _
            pnlCode.Size.Width, pnlCode.Size.Height)
    End Sub
End Class

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 4 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Martin am 27.01.2009 um 13:57

Hallo Leute,

vielen Dank erstmal für den super Ansatz, genau danach habe
ich gesucht!

Frage:
Hat jemand eine Idee, wie ich das generierte Bild (Barcode 39) jetzt wieder einlesen und auswerten kann?

Ich wäre für jeden Ansatz (Idee) sehr dankbar, beste Grüße
Martin

Kommentar von Yasser am 13.01.2008 um 00:12

sehr hilfreich, Danke.

Kommentar von am 10.12.2006 um 18:45

funktioniert super !

Kommentar von Gianluca am 30.07.2004 um 10:35

Hi,
I've used the same script two years ago, but it was VB 6.0... now I need to develop the same thing using asp net... and I've found problems to convert this code to generate a png, or a gif Image to print via browser. Could you help me?