lunedì 1 agosto 2016

.Net creazione di un controllo barcode con Visual Basic Net e C#

Si riporta l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_net-creazione-di-un-controllo-barcode-in_1448.aspx

In questo articolo vedremo come realizzare un controllo personalizzato in .Net tramite il linguaggio VB.Net e C#, che permette di generare codice Barcode esportabili in formato jpg o da stampare, indicando del testo.
Si crea un nuovo progetto di tipo Windows Application, in questo modo faremo le prove su una form.
Dopo aver creato un progetto in base al linguaggio di proprio interesse, aggiungiamo un controllo personalizzato come mostrato in figura 1.


Figura 1 – La creazione di un controllo personalizzato.

Stesura del codice

Ora passiamo in visualizzazione codice.
Prima di tutto dobbiamo aggiungere lo spazio dei nomi che ci permetterà di gestire la stampa e la grafica.
Qui di seguito si riporta la dichiarazione di tali spazio di nomi.


VB.Net

Imports System.Drawing.Printing

Imports System.Drawing.Imaging

 

C#

using System.Drawing.Printing;

using System.Drawing.Imaging;



Dopo aver aggiunto lo spazio di nomi di nostro interesse, non ci resta che scrivere il codice per la gestione della grafica sul controllo, ossia che ci permette di visualizzare le varie barre.
Oltre a tale metodo dobbiamo creare gestori di evento per la stampa e per la gestione del menu contestuale.
Qui di seguito si riporta la dichiarazione per il gestore dell’evento click sul controllo per entrambi i linguaggi. A questi si aggiungo gli oggetti e la variabili a livello di classe, per i menu, per la gestione del testo e per la definizione dello spazio tra le varie barre.


VB.Net

  Private m_MenuSceltaRapida As New ContextMenuStrip()

    Private m_RapportoLargoStrettoBarre As Integer = 2

    Private caratteri As New Dictionary(Of String, Byte())()

Public Property RapportoBarre() As Integer

        Get

            Return m_RapportoLargoStrettoBarre

        End Get

        Set(value As Integer)

            m_RapportoLargoStrettoBarre = value

        End Set

    End Property

 

C#

private ContextMenuStrip m_MenuSceltaRapida = new ContextMenuStrip();

        private int m_RapportoLargoStrettoBarre = 2;

        private Dictionary<string, byte[]> caratteri = new Dictionary<string, byte[]>();

 

        public int RapportoBarre

        {

            get { return m_RapportoLargoStrettoBarre; }

            set { m_RapportoLargoStrettoBarre = value; }

        }

Qui di seguito si riportano i gestori degli eventi del controllo click per il menu contestuale, dell’evento stampa e del testo che cambia. Per quest’ultimo evento, riguarda la possibilità di cambiare l’anteprima delle barre durante la digitazione.



VB.Net

Private Sub Barcode39_TextChanged(sender As Object, e As EventArgs)

        Me.Refresh()

    End Sub

    Private Sub m_MenuSceltaRapida_ItemClicked(sender As Object, e As ToolStripItemClickedEventArgs)

        If e.ClickedItem.Text = "Stampa" Then

            Dim stampa As New PrintDocument()

            AddHandler stampa.PrintPage, AddressOf stampa_PrintPage

            'stampa.PrintPage += New PrintPageEventHandler(AddressOf stampa_PrintPage)

            stampa.Print()

        ElseIf e.ClickedItem.Text = "Esporta" Then

            m_MenuSceltaRapida.Close()

            Dim SaveDialog As New SaveFileDialog()

            SaveDialog.ShowDialog()

            If SaveDialog.FileName <> "" Then

                Dim bitmap As New Bitmap(Me.Width, Me.Height)

                Me.DrawToBitmap(bitmap, New Rectangle(0, 0, Me.Width, Me.Height))

                Dim image As Image = DirectCast(bitmap, Image)

                image.Save(SaveDialog.FileName + ".jpg", ImageFormat.Jpeg)

            End If

        End If

    End Sub

    Private Sub stampa_PrintPage(sender As Object, e As PrintPageEventArgs)

        Dim bitmap As New Bitmap(Me.Width, Me.Height)

        Me.DrawToBitmap(bitmap, New Rectangle(0, 0, Me.Width, Me.Height))

        Dim image As Image = DirectCast(bitmap, Image)

        e.Graphics.DrawImage(image, New Point(10, 10))

 

    End Sub

 

 

C#

void Barcode39_TextChanged(object sender, EventArgs e)

        {

            this.Refresh();

        }

 

void m_MenuSceltaRapida_ItemClicked(object sender, ToolStripItemClickedEventArgs e)

        {

            if (e.ClickedItem.Text == "Stampa")

            {

                PrintDocument stampa = new PrintDocument();

                stampa.PrintPage += new PrintPageEventHandler(stampa_PrintPage);

                stampa.Print();

            }

            else if (e.ClickedItem.Text == "Esporta")

            {

                m_MenuSceltaRapida.Close();

                SaveFileDialog SaveDialog = new SaveFileDialog();

                SaveDialog.ShowDialog();

                if (SaveDialog.FileName != "")

                {

                    Bitmap bitmap = new Bitmap(this.Width, this.Height);

                    this.DrawToBitmap(bitmap, new Rectangle(0, 0, this.Width, this.Height));

                    Image image = (Image)bitmap;

                    image.Save(SaveDialog.FileName + ".jpg", ImageFormat.Jpeg);

                }

            }

        }

        void stampa_PrintPage(object sender, PrintPageEventArgs e)

        {

            Bitmap bitmap = new Bitmap(this.Width, this.Height);

            this.DrawToBitmap(bitmap, new Rectangle(0, 0, this.Width, this.Height));

            Image image = (Image)bitmap;

            e.Graphics.DrawImage(image, new Point(10, 10));

 

        }




Dalla lista del precedente codice, il gestore evento click verifica quale voce è stata selezionata, nel caso riguarda la stampa, verrà avviato l’evento per l’invio dell’immagine alla stampante, nel caso che viene selezionata la voce “Esporta” tramite la classe image, bitmap verrà generato un file di tipo .Jpg, con il nome assegnato dall’utente, nel quale sarà presente il codice Barcode.
Ora dobbiamo creare un metodo che permette la generazione del barcode, in particolare il metodo che genera le righe verticali, quelle bianche e nere.
Qui di seguito si riporta il frammento di codice delle suddette operazioni per entrambi i linguaggi.


VB.Net

Private Sub DisegnaBarcode(pGraphics As Graphics)

        Dim testo As String = Me.Text.ToUpper()

        If Not testo.StartsWith("*") Then

            testo = Convert.ToString("*") & testo

        End If

        If Not testo.EndsWith("*") Then

            testo = testo & Convert.ToString("*")

        End If

        pGraphics.FillRectangle(New SolidBrush(Me.BackColor), 0, 0, Me.Width, Me.Height)

        Dim strettoCount As Integer = 0

        Dim largoCount As Integer = 0

        Dim BarreNereCount As Integer = 0

        For i As Integer = 0 To testo.Length - 1

            Dim testoArray As Byte() = caratteri(testo.Substring(i, 1))

            For Each insByte As Byte In testoArray

                If insByte = 1 Then

                    largoCount += 1

                Else

                    strettoCount += 1

                End If

            Next

            If i + 1 <> testo.Length Then

                BarreNereCount += 1

            End If

        Next

        Dim larghezzaPerUnit As Decimal = Math.Round(Convert.ToDecimal(Me.Width) / Convert.ToDecimal(((largoCount * m_RapportoLargoStrettoBarre) + BarreNereCount + strettoCount)), 2)

        Dim margineSinistroCorrente As Decimal = 0

        For i As Integer = 0 To testo.Length - 1

            Dim insByteArray As Byte() = caratteri(testo.Substring(i, 1))

            Dim index As Integer = 0

            For Each insByte As Byte In insByteArray

                If index Mod 2 = 0 Then

 

                    pGraphics.FillRectangle(New SolidBrush(Me.ForeColor), CSng(margineSinistroCorrente), 0, CSng(If(insByte = 1, larghezzaPerUnit * m_RapportoLargoStrettoBarre, larghezzaPerUnit)), Me.Height)

                End If

                margineSinistroCorrente += (If(insByte = 1, larghezzaPerUnit * m_RapportoLargoStrettoBarre, larghezzaPerUnit))

 

                index += 1

            Next

            margineSinistroCorrente += larghezzaPerUnit

        Next

    End Sub

 

C#

    private void DisegnaBarcode(Graphics pGraphics)

        {

            string testo = this.Text.ToUpper();

            if (!testo.StartsWith("*"))

            {

                testo = "*" + testo;

            }

            if (!testo.EndsWith("*"))

            {

                testo = testo + "*";

            }

            pGraphics.FillRectangle(new SolidBrush(this.BackColor), 0, 0, this.Width, this.Height);

            int strettoCount = 0;

            int largoCount = 0;

            int BarreNereCount = 0;

            for (int i = 0; i < testo.Length; i++)

            {

                byte[] testoArray = caratteri[testo.Substring(i, 1)];

                foreach (byte insByte in testoArray)

                {

                    if (insByte == 1)

                    {

                        largoCount++;

                    }

                    else

                    {

                        strettoCount++;

                    }

                }

                if (i + 1 != testo.Length)

                {

                    BarreNereCount++;

                }

            }

            decimal larghezzaPerUnit = Math.Round(Convert.ToDecimal(this.Width) / Convert.ToDecimal(((largoCount * m_RapportoLargoStrettoBarre) + BarreNereCount + strettoCount)), 2);

            decimal margineSinistroCorrente = 0;

            for (int i = 0; i < testo.Length; i++)

            {

                byte[] insByteArray = caratteri[testo.Substring(i, 1)];

                int index = 0;

                foreach (byte insByte in insByteArray)

                {

                    if (index % 2 == 0)

                    {

                        pGraphics.FillRectangle(new SolidBrush(this.ForeColor), (float)margineSinistroCorrente, 0, (float)(insByte == 1 ? larghezzaPerUnit * m_RapportoLargoStrettoBarre : larghezzaPerUnit), this.Height);

 

                    }

                    margineSinistroCorrente += (insByte == 1 ? larghezzaPerUnit * m_RapportoLargoStrettoBarre : larghezzaPerUnit);

 

                    index++;

                }

                margineSinistroCorrente += larghezzaPerUnit;

            }

        }


Nell’evento onpaint, dobbiamo scrivere il codice, che in tempo reale visualizzerà il barcode, ossia le barre durante la digitazione del testo in un controllo textbox.
Qui di seguito si riporta il frammento di codice per entrambi i linguaggi per il linguaggio onpaint.



VB.Net

Protected Overrides Sub OnPaint(pe As PaintEventArgs)

        MyBase.OnPaint(pe)

        Try

            DisegnaBarcode(pe.Graphics)

        Catch generatedExceptionName As Exception

            pe.Graphics.DrawString("No Barcode", New Font("Times New Roman", 12), Brushes.Red, 0, 0)

        End Try

    End Sub

 

C#

protected override void OnPaint(PaintEventArgs pe)

        {

            base.OnPaint(pe);

            try

            {

                DisegnaBarcode(pe.Graphics);

            }

            catch (Exception)

            {

                pe.Graphics.DrawString("No Barcode", new Font("Times New Roman", 12), Brushes.Red, 0, 0);

            }

        }



Ora non ci resta che scrivere il codice nel costruttore, che è quello che permette di inizializzare i vari oggetti.
Qui di seguito si riporta tale dichiarazione



VB.Net

Public Sub New()

        m_MenuSceltaRapida.Items.Add("Esporta")

        m_MenuSceltaRapida.Items.Add("Stampa")

        Me.ContextMenuStrip = m_MenuSceltaRapida

        AddHandler m_MenuSceltaRapida.ItemClicked, AddressOf m_MenuSceltaRapida_ItemClicked

        'm_MenuSceltaRapida.ItemClicked += New ToolStripItemClickedEventHandler(AddressOf m_MenuSceltaRapida_ItemClicked)

        Me.BackColor = Color.White

        AddHandler Me.TextChanged, AddressOf Barcode39_TextChanged

 

        'Me.TextChanged += New EventHandler(AddressOf Barcode39_TextChanged)

        caratteri.Add("1", New Byte() {1, 0, 0, 1, 0, 0, _

         0, 0, 1})

        caratteri.Add("2", New Byte() {0, 0, 1, 1, 0, 0, _

         0, 0, 1})

        caratteri.Add("3", New Byte() {1, 0, 1, 1, 0, 0, _

         0, 0, 0})

        caratteri.Add("4", New Byte() {0, 0, 0, 1, 1, 0, _

         0, 0, 1})

        caratteri.Add("5", New Byte() {1, 0, 0, 1, 1, 0, _

         0, 0, 0})

        caratteri.Add("6", New Byte() {0, 0, 1, 1, 1, 0, _

         0, 0, 0})

        caratteri.Add("7", New Byte() {0, 0, 0, 1, 0, 0, _

         1, 0, 1})

        caratteri.Add("8", New Byte() {1, 0, 0, 1, 0, 0, _

         1, 0, 0})

        caratteri.Add("9", New Byte() {0, 0, 1, 1, 0, 0, _

         1, 0, 0})

        caratteri.Add("0", New Byte() {0, 0, 0, 1, 1, 0, _

         1, 0, 0})

        caratteri.Add("A", New Byte() {1, 0, 0, 0, 0, 1, _

         0, 0, 1})

        caratteri.Add("B", New Byte() {0, 0, 1, 0, 0, 1, _

         0, 0, 1})

        caratteri.Add("C", New Byte() {1, 0, 1, 0, 0, 1, _

         0, 0, 0})

        caratteri.Add("D", New Byte() {0, 0, 0, 0, 1, 1, _

         0, 0, 1})

        caratteri.Add("E", New Byte() {1, 0, 0, 0, 1, 1, _

         0, 0, 0})

        caratteri.Add("F", New Byte() {0, 0, 1, 0, 1, 1, _

         0, 0, 0})

        caratteri.Add("G", New Byte() {0, 0, 0, 0, 0, 1, _

         1, 0, 1})

        caratteri.Add("H", New Byte() {1, 0, 0, 0, 0, 1, _

         1, 0, 0})

        caratteri.Add("I", New Byte() {0, 0, 1, 0, 0, 1, _

         1, 0, 0})

        caratteri.Add("J", New Byte() {0, 0, 0, 0, 1, 1, _

         1, 0, 0})

        caratteri.Add("K", New Byte() {1, 0, 0, 0, 0, 0, _

         0, 1, 1})

        caratteri.Add("L", New Byte() {0, 0, 1, 0, 0, 0, _

         0, 1, 1})

        caratteri.Add("M", New Byte() {1, 0, 1, 0, 0, 0, _

         0, 1, 0})

        caratteri.Add("N", New Byte() {0, 0, 0, 0, 1, 0, _

         0, 1, 1})

        caratteri.Add("O", New Byte() {1, 0, 0, 0, 1, 0, _

         0, 1, 0})

        caratteri.Add("P", New Byte() {0, 0, 1, 0, 1, 0, _

         0, 1, 0})

        caratteri.Add("Q", New Byte() {0, 0, 0, 0, 0, 0, _

         1, 1, 1})

        caratteri.Add("R", New Byte() {1, 0, 0, 0, 0, 0, _

         1, 1, 0})

        caratteri.Add("S", New Byte() {0, 0, 1, 0, 0, 0, _

         1, 1, 0})

        caratteri.Add("T", New Byte() {0, 0, 0, 0, 1, 0, _

         1, 1, 0})

        caratteri.Add("U", New Byte() {1, 1, 0, 0, 0, 0, _

         0, 0, 1})

        caratteri.Add("V", New Byte() {0, 1, 1, 0, 0, 0, _

         0, 0, 1})

        caratteri.Add("W", New Byte() {1, 1, 1, 0, 0, 0, _

         0, 0, 0})

        caratteri.Add("X", New Byte() {0, 1, 0, 0, 1, 0, _

         0, 0, 1})

        caratteri.Add("Y", New Byte() {1, 1, 0, 0, 1, 0, _

         0, 0, 0})

        caratteri.Add("Z", New Byte() {0, 1, 1, 0, 1, 0, _

         0, 0, 0})

        caratteri.Add("-", New Byte() {0, 1, 0, 0, 0, 0, _

         1, 0, 1})

        caratteri.Add(".", New Byte() {1, 1, 0, 0, 0, 0, _

         1, 0, 0})

        caratteri.Add(" ", New Byte() {0, 1, 1, 0, 0, 0, _

         1, 0, 0})

        caratteri.Add("*", New Byte() {0, 1, 0, 0, 1, 0, _

         1, 0, 0})

        caratteri.Add("$", New Byte() {0, 1, 0, 1, 0, 1, _

         0, 0, 0})

        caratteri.Add("/", New Byte() {0, 1, 0, 1, 0, 0, _

         0, 1, 0})

        caratteri.Add("+", New Byte() {0, 1, 0, 0, 0, 1, _

         0, 1, 0})

        caratteri.Add("%", New Byte() {0, 0, 0, 1, 0, 1, _

         0, 1, 0})

    End Sub

 

 

 

C#

  public Barcode39()

        {

            m_MenuSceltaRapida.Items.Add("Esporta");

            m_MenuSceltaRapida.Items.Add("Stampa");

            this.ContextMenuStrip = m_MenuSceltaRapida;

            m_MenuSceltaRapida.ItemClicked += new ToolStripItemClickedEventHandler(m_MenuSceltaRapida_ItemClicked);

            this.BackColor = Color.White;

            this.TextChanged += new EventHandler(Barcode39_TextChanged);

            caratteri.Add("1", new byte[] { 1, 0, 0, 1, 0, 0, 0, 0, 1 });

            caratteri.Add("2", new byte[] { 0, 0, 1, 1, 0, 0, 0, 0, 1 });

            caratteri.Add("3", new byte[] { 1, 0, 1, 1, 0, 0, 0, 0, 0 });

            caratteri.Add("4", new byte[] { 0, 0, 0, 1, 1, 0, 0, 0, 1 });

            caratteri.Add("5", new byte[] { 1, 0, 0, 1, 1, 0, 0, 0, 0 });

            caratteri.Add("6", new byte[] { 0, 0, 1, 1, 1, 0, 0, 0, 0 });

            caratteri.Add("7", new byte[] { 0, 0, 0, 1, 0, 0, 1, 0, 1 });

            caratteri.Add("8", new byte[] { 1, 0, 0, 1, 0, 0, 1, 0, 0 });

            caratteri.Add("9", new byte[] { 0, 0, 1, 1, 0, 0, 1, 0, 0 });

            caratteri.Add("0", new byte[] { 0, 0, 0, 1, 1, 0, 1, 0, 0 });

            caratteri.Add("A", new byte[] { 1, 0, 0, 0, 0, 1, 0, 0, 1 });

            caratteri.Add("B", new byte[] { 0, 0, 1, 0, 0, 1, 0, 0, 1 });

            caratteri.Add("C", new byte[] { 1, 0, 1, 0, 0, 1, 0, 0, 0 });

            caratteri.Add("D", new byte[] { 0, 0, 0, 0, 1, 1, 0, 0, 1 });

            caratteri.Add("E", new byte[] { 1, 0, 0, 0, 1, 1, 0, 0, 0 });

            caratteri.Add("F", new byte[] { 0, 0, 1, 0, 1, 1, 0, 0, 0 });

            caratteri.Add("G", new byte[] { 0, 0, 0, 0, 0, 1, 1, 0, 1 });

            caratteri.Add("H", new byte[] { 1, 0, 0, 0, 0, 1, 1, 0, 0 });

            caratteri.Add("I", new byte[] { 0, 0, 1, 0, 0, 1, 1, 0, 0 });

            caratteri.Add("J", new byte[] { 0, 0, 0, 0, 1, 1, 1, 0, 0 });

            caratteri.Add("K", new byte[] { 1, 0, 0, 0, 0, 0, 0, 1, 1 });

            caratteri.Add("L", new byte[] { 0, 0, 1, 0, 0, 0, 0, 1, 1 });

            caratteri.Add("M", new byte[] { 1, 0, 1, 0, 0, 0, 0, 1, 0 });

            caratteri.Add("N", new byte[] { 0, 0, 0, 0, 1, 0, 0, 1, 1 });

            caratteri.Add("O", new byte[] { 1, 0, 0, 0, 1, 0, 0, 1, 0 });

            caratteri.Add("P", new byte[] { 0, 0, 1, 0, 1, 0, 0, 1, 0 });

            caratteri.Add("Q", new byte[] { 0, 0, 0, 0, 0, 0, 1, 1, 1 });

            caratteri.Add("R", new byte[] { 1, 0, 0, 0, 0, 0, 1, 1, 0 });

            caratteri.Add("S", new byte[] { 0, 0, 1, 0, 0, 0, 1, 1, 0 });

            caratteri.Add("T", new byte[] { 0, 0, 0, 0, 1, 0, 1, 1, 0 });

            caratteri.Add("U", new byte[] { 1, 1, 0, 0, 0, 0, 0, 0, 1 });

            caratteri.Add("V", new byte[] { 0, 1, 1, 0, 0, 0, 0, 0, 1 });

            caratteri.Add("W", new byte[] { 1, 1, 1, 0, 0, 0, 0, 0, 0 });

            caratteri.Add("X", new byte[] { 0, 1, 0, 0, 1, 0, 0, 0, 1 });

            caratteri.Add("Y", new byte[] { 1, 1, 0, 0, 1, 0, 0, 0, 0 });

            caratteri.Add("Z", new byte[] { 0, 1, 1, 0, 1, 0, 0, 0, 0 });

            caratteri.Add("-", new byte[] { 0, 1, 0, 0, 0, 0, 1, 0, 1 });

            caratteri.Add(".", new byte[] { 1, 1, 0, 0, 0, 0, 1, 0, 0 });

            caratteri.Add(" ", new byte[] { 0, 1, 1, 0, 0, 0, 1, 0, 0 });

            caratteri.Add("*", new byte[] { 0, 1, 0, 0, 1, 0, 1, 0, 0 });

            caratteri.Add("$", new byte[] { 0, 1, 0, 1, 0, 1, 0, 0, 0 });

            caratteri.Add("/", new byte[] { 0, 1, 0, 1, 0, 0, 0, 1, 0 });

            caratteri.Add("+", new byte[] { 0, 1, 0, 0, 0, 1, 0, 1, 0 });

            caratteri.Add("%", new byte[] { 0, 0, 0, 1, 0, 1, 0, 1, 0 });

        }



Si riporta il codice completo delle classi.




VB.Net

 

Imports System.Collections.Generic

Imports System.ComponentModel

Imports System.Data

Imports System.Drawing

Imports System.Linq

Imports System.Text

Imports System.Windows.Forms

 

 

Imports System.Drawing.Printing

Imports System.Drawing.Imaging

 

Partial Public Class Barcode39

    Inherits Control

    Private m_MenuSceltaRapida As New ContextMenuStrip()

    Private m_RapportoLargoStrettoBarre As Integer = 2

    Private caratteri As New Dictionary(Of String, Byte())()

 

    Public Property RapportoBarre() As Integer

        Get

            Return m_RapportoLargoStrettoBarre

        End Get

        Set(value As Integer)

            m_RapportoLargoStrettoBarre = value

        End Set

    End Property

 

 

    Public Sub New()

        m_MenuSceltaRapida.Items.Add("Esporta")

        m_MenuSceltaRapida.Items.Add("Stampa")

        Me.ContextMenuStrip = m_MenuSceltaRapida

        AddHandler m_MenuSceltaRapida.ItemClicked, AddressOf m_MenuSceltaRapida_ItemClicked


        Me.BackColor = Color.White

        AddHandler Me.TextChanged, AddressOf Barcode39_TextChanged

 

        caratteri.Add("1", New Byte() {1, 0, 0, 1, 0, 0, _

         0, 0, 1})

        caratteri.Add("2", New Byte() {0, 0, 1, 1, 0, 0, _

         0, 0, 1})

        caratteri.Add("3", New Byte() {1, 0, 1, 1, 0, 0, _

         0, 0, 0})

        caratteri.Add("4", New Byte() {0, 0, 0, 1, 1, 0, _

         0, 0, 1})

        caratteri.Add("5", New Byte() {1, 0, 0, 1, 1, 0, _

         0, 0, 0})

        caratteri.Add("6", New Byte() {0, 0, 1, 1, 1, 0, _

         0, 0, 0})

        caratteri.Add("7", New Byte() {0, 0, 0, 1, 0, 0, _

         1, 0, 1})

        caratteri.Add("8", New Byte() {1, 0, 0, 1, 0, 0, _

         1, 0, 0})

        caratteri.Add("9", New Byte() {0, 0, 1, 1, 0, 0, _

         1, 0, 0})

        caratteri.Add("0", New Byte() {0, 0, 0, 1, 1, 0, _

         1, 0, 0})

        caratteri.Add("A", New Byte() {1, 0, 0, 0, 0, 1, _

         0, 0, 1})

        caratteri.Add("B", New Byte() {0, 0, 1, 0, 0, 1, _

         0, 0, 1})

        caratteri.Add("C", New Byte() {1, 0, 1, 0, 0, 1, _

         0, 0, 0})

        caratteri.Add("D", New Byte() {0, 0, 0, 0, 1, 1, _

         0, 0, 1})

        caratteri.Add("E", New Byte() {1, 0, 0, 0, 1, 1, _

         0, 0, 0})

        caratteri.Add("F", New Byte() {0, 0, 1, 0, 1, 1, _

         0, 0, 0})

        caratteri.Add("G", New Byte() {0, 0, 0, 0, 0, 1, _

         1, 0, 1})

        caratteri.Add("H", New Byte() {1, 0, 0, 0, 0, 1, _

         1, 0, 0})

        caratteri.Add("I", New Byte() {0, 0, 1, 0, 0, 1, _

         1, 0, 0})

        caratteri.Add("J", New Byte() {0, 0, 0, 0, 1, 1, _

         1, 0, 0})

        caratteri.Add("K", New Byte() {1, 0, 0, 0, 0, 0, _

         0, 1, 1})

        caratteri.Add("L", New Byte() {0, 0, 1, 0, 0, 0, _

         0, 1, 1})

        caratteri.Add("M", New Byte() {1, 0, 1, 0, 0, 0, _

         0, 1, 0})

        caratteri.Add("N", New Byte() {0, 0, 0, 0, 1, 0, _

         0, 1, 1})

        caratteri.Add("O", New Byte() {1, 0, 0, 0, 1, 0, _

         0, 1, 0})

        caratteri.Add("P", New Byte() {0, 0, 1, 0, 1, 0, _

         0, 1, 0})

        caratteri.Add("Q", New Byte() {0, 0, 0, 0, 0, 0, _

         1, 1, 1})

        caratteri.Add("R", New Byte() {1, 0, 0, 0, 0, 0, _

         1, 1, 0})

        caratteri.Add("S", New Byte() {0, 0, 1, 0, 0, 0, _

         1, 1, 0})

        caratteri.Add("T", New Byte() {0, 0, 0, 0, 1, 0, _

         1, 1, 0})

        caratteri.Add("U", New Byte() {1, 1, 0, 0, 0, 0, _

         0, 0, 1})

        caratteri.Add("V", New Byte() {0, 1, 1, 0, 0, 0, _

         0, 0, 1})

        caratteri.Add("W", New Byte() {1, 1, 1, 0, 0, 0, _

         0, 0, 0})

        caratteri.Add("X", New Byte() {0, 1, 0, 0, 1, 0, _

         0, 0, 1})

        caratteri.Add("Y", New Byte() {1, 1, 0, 0, 1, 0, _

         0, 0, 0})

        caratteri.Add("Z", New Byte() {0, 1, 1, 0, 1, 0, _

         0, 0, 0})

        caratteri.Add("-", New Byte() {0, 1, 0, 0, 0, 0, _

         1, 0, 1})

        caratteri.Add(".", New Byte() {1, 1, 0, 0, 0, 0, _

         1, 0, 0})

        caratteri.Add(" ", New Byte() {0, 1, 1, 0, 0, 0, _

         1, 0, 0})

        caratteri.Add("*", New Byte() {0, 1, 0, 0, 1, 0, _

         1, 0, 0})

        caratteri.Add("$", New Byte() {0, 1, 0, 1, 0, 1, _

         0, 0, 0})

        caratteri.Add("/", New Byte() {0, 1, 0, 1, 0, 0, _

         0, 1, 0})

        caratteri.Add("+", New Byte() {0, 1, 0, 0, 0, 1, _

         0, 1, 0})

        caratteri.Add("%", New Byte() {0, 0, 0, 1, 0, 1, _

         0, 1, 0})

    End Sub

 

    Protected Overrides Sub OnPaint(pe As PaintEventArgs)

        MyBase.OnPaint(pe)

        Try

            DisegnaBarcode(pe.Graphics)

        Catch generatedExceptionName As Exception

            pe.Graphics.DrawString("No Barcode", New Font("Times New Roman", 12), Brushes.Red, 0, 0)

        End Try

    End Sub

 

    Private Sub DisegnaBarcode(pGraphics As Graphics)

        Dim testo As String = Me.Text.ToUpper()

        If Not testo.StartsWith("*") Then

            testo = Convert.ToString("*") & testo

        End If

        If Not testo.EndsWith("*") Then

            testo = testo & Convert.ToString("*")

        End If

        pGraphics.FillRectangle(New SolidBrush(Me.BackColor), 0, 0, Me.Width, Me.Height)

        Dim strettoCount As Integer = 0

        Dim largoCount As Integer = 0

        Dim BarreNereCount As Integer = 0

        For i As Integer = 0 To testo.Length - 1

            Dim testoArray As Byte() = caratteri(testo.Substring(i, 1))

            For Each insByte As Byte In testoArray

                If insByte = 1 Then

                    largoCount += 1

                Else

                    strettoCount += 1

                End If

            Next

            If i + 1 <> testo.Length Then

                BarreNereCount += 1

            End If

        Next

        Dim larghezzaPerUnit As Decimal = Math.Round(Convert.ToDecimal(Me.Width) / Convert.ToDecimal(((largoCount * m_RapportoLargoStrettoBarre) + BarreNereCount + strettoCount)), 2)

        Dim margineSinistroCorrente As Decimal = 0

        For i As Integer = 0 To testo.Length - 1

            Dim insByteArray As Byte() = caratteri(testo.Substring(i, 1))

            Dim index As Integer = 0

            For Each insByte As Byte In insByteArray

                If index Mod 2 = 0 Then

 

                    pGraphics.FillRectangle(New SolidBrush(Me.ForeColor), CSng(margineSinistroCorrente), 0, CSng(If(insByte = 1, larghezzaPerUnit * m_RapportoLargoStrettoBarre, larghezzaPerUnit)), Me.Height)

                End If

                margineSinistroCorrente += (If(insByte = 1, larghezzaPerUnit * m_RapportoLargoStrettoBarre, larghezzaPerUnit))

 

                index += 1

            Next

            margineSinistroCorrente += larghezzaPerUnit

        Next

    End Sub

 

    Private Sub Barcode39_TextChanged(sender As Object, e As EventArgs)

        Me.Refresh()

    End Sub

    Private Sub m_MenuSceltaRapida_ItemClicked(sender As Object, e As ToolStripItemClickedEventArgs)

        If e.ClickedItem.Text = "Stampa" Then

            Dim stampa As New PrintDocument()

            AddHandler stampa.PrintPage, AddressOf stampa_PrintPage

 
            stampa.Print()

        ElseIf e.ClickedItem.Text = "Esporta" Then

            m_MenuSceltaRapida.Close()

            Dim SaveDialog As New SaveFileDialog()

            SaveDialog.ShowDialog()

            If SaveDialog.FileName <> "" Then

                Dim bitmap As New Bitmap(Me.Width, Me.Height)

                Me.DrawToBitmap(bitmap, New Rectangle(0, 0, Me.Width, Me.Height))

                Dim image As Image = DirectCast(bitmap, Image)

                image.Save(SaveDialog.FileName + ".jpg", ImageFormat.Jpeg)

            End If

        End If

    End Sub

    Private Sub stampa_PrintPage(sender As Object, e As PrintPageEventArgs)

        Dim bitmap As New Bitmap(Me.Width, Me.Height)

        Me.DrawToBitmap(bitmap, New Rectangle(0, 0, Me.Width, Me.Height))

        Dim image As Image = DirectCast(bitmap, Image)

        e.Graphics.DrawImage(image, New Point(10, 10))

 

    End Sub

 

 

End Class

 

 

C#

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

 

using System.Drawing.Printing;

using System.Drawing.Imaging;

 

namespace WinBarcode

{

    public partial class Barcode39 : Control

    {

        private ContextMenuStrip m_MenuSceltaRapida = new ContextMenuStrip();

        private int m_RapportoLargoStrettoBarre = 2;

        private Dictionary<string, byte[]> caratteri = new Dictionary<string, byte[]>();

 

        public int RapportoBarre

        {

            get { return m_RapportoLargoStrettoBarre; }

            set { m_RapportoLargoStrettoBarre = value; }

        }

 

 

        public Barcode39()

        {

            m_MenuSceltaRapida.Items.Add("Esporta");

            m_MenuSceltaRapida.Items.Add("Stampa");

            this.ContextMenuStrip = m_MenuSceltaRapida;

            m_MenuSceltaRapida.ItemClicked += new ToolStripItemClickedEventHandler(m_MenuSceltaRapida_ItemClicked);

            this.BackColor = Color.White;

            this.TextChanged += new EventHandler(Barcode39_TextChanged);

            caratteri.Add("1", new byte[] { 1, 0, 0, 1, 0, 0, 0, 0, 1 });

            caratteri.Add("2", new byte[] { 0, 0, 1, 1, 0, 0, 0, 0, 1 });

            caratteri.Add("3", new byte[] { 1, 0, 1, 1, 0, 0, 0, 0, 0 });

            caratteri.Add("4", new byte[] { 0, 0, 0, 1, 1, 0, 0, 0, 1 });

            caratteri.Add("5", new byte[] { 1, 0, 0, 1, 1, 0, 0, 0, 0 });

            caratteri.Add("6", new byte[] { 0, 0, 1, 1, 1, 0, 0, 0, 0 });

            caratteri.Add("7", new byte[] { 0, 0, 0, 1, 0, 0, 1, 0, 1 });

            caratteri.Add("8", new byte[] { 1, 0, 0, 1, 0, 0, 1, 0, 0 });

            caratteri.Add("9", new byte[] { 0, 0, 1, 1, 0, 0, 1, 0, 0 });

            caratteri.Add("0", new byte[] { 0, 0, 0, 1, 1, 0, 1, 0, 0 });

            caratteri.Add("A", new byte[] { 1, 0, 0, 0, 0, 1, 0, 0, 1 });

            caratteri.Add("B", new byte[] { 0, 0, 1, 0, 0, 1, 0, 0, 1 });

            caratteri.Add("C", new byte[] { 1, 0, 1, 0, 0, 1, 0, 0, 0 });

            caratteri.Add("D", new byte[] { 0, 0, 0, 0, 1, 1, 0, 0, 1 });

            caratteri.Add("E", new byte[] { 1, 0, 0, 0, 1, 1, 0, 0, 0 });

            caratteri.Add("F", new byte[] { 0, 0, 1, 0, 1, 1, 0, 0, 0 });

            caratteri.Add("G", new byte[] { 0, 0, 0, 0, 0, 1, 1, 0, 1 });

            caratteri.Add("H", new byte[] { 1, 0, 0, 0, 0, 1, 1, 0, 0 });

            caratteri.Add("I", new byte[] { 0, 0, 1, 0, 0, 1, 1, 0, 0 });

            caratteri.Add("J", new byte[] { 0, 0, 0, 0, 1, 1, 1, 0, 0 });

            caratteri.Add("K", new byte[] { 1, 0, 0, 0, 0, 0, 0, 1, 1 });

            caratteri.Add("L", new byte[] { 0, 0, 1, 0, 0, 0, 0, 1, 1 });

            caratteri.Add("M", new byte[] { 1, 0, 1, 0, 0, 0, 0, 1, 0 });

            caratteri.Add("N", new byte[] { 0, 0, 0, 0, 1, 0, 0, 1, 1 });

            caratteri.Add("O", new byte[] { 1, 0, 0, 0, 1, 0, 0, 1, 0 });

            caratteri.Add("P", new byte[] { 0, 0, 1, 0, 1, 0, 0, 1, 0 });

            caratteri.Add("Q", new byte[] { 0, 0, 0, 0, 0, 0, 1, 1, 1 });

            caratteri.Add("R", new byte[] { 1, 0, 0, 0, 0, 0, 1, 1, 0 });

            caratteri.Add("S", new byte[] { 0, 0, 1, 0, 0, 0, 1, 1, 0 });

            caratteri.Add("T", new byte[] { 0, 0, 0, 0, 1, 0, 1, 1, 0 });

            caratteri.Add("U", new byte[] { 1, 1, 0, 0, 0, 0, 0, 0, 1 });

            caratteri.Add("V", new byte[] { 0, 1, 1, 0, 0, 0, 0, 0, 1 });

            caratteri.Add("W", new byte[] { 1, 1, 1, 0, 0, 0, 0, 0, 0 });

            caratteri.Add("X", new byte[] { 0, 1, 0, 0, 1, 0, 0, 0, 1 });

            caratteri.Add("Y", new byte[] { 1, 1, 0, 0, 1, 0, 0, 0, 0 });

            caratteri.Add("Z", new byte[] { 0, 1, 1, 0, 1, 0, 0, 0, 0 });

            caratteri.Add("-", new byte[] { 0, 1, 0, 0, 0, 0, 1, 0, 1 });

            caratteri.Add(".", new byte[] { 1, 1, 0, 0, 0, 0, 1, 0, 0 });

            caratteri.Add(" ", new byte[] { 0, 1, 1, 0, 0, 0, 1, 0, 0 });

            caratteri.Add("*", new byte[] { 0, 1, 0, 0, 1, 0, 1, 0, 0 });

            caratteri.Add("$", new byte[] { 0, 1, 0, 1, 0, 1, 0, 0, 0 });

            caratteri.Add("/", new byte[] { 0, 1, 0, 1, 0, 0, 0, 1, 0 });

            caratteri.Add("+", new byte[] { 0, 1, 0, 0, 0, 1, 0, 1, 0 });

            caratteri.Add("%", new byte[] { 0, 0, 0, 1, 0, 1, 0, 1, 0 });

        }

 

        protected override void OnPaint(PaintEventArgs pe)

        {

            base.OnPaint(pe);

            try

            {

                DisegnaBarcode(pe.Graphics);

            }

            catch (Exception)

            {

                pe.Graphics.DrawString("No Barcode", new Font("Times New Roman", 12), Brushes.Red, 0, 0);

            }

        }

 

        private void DisegnaBarcode(Graphics pGraphics)

        {

            string testo = this.Text.ToUpper();

            if (!testo.StartsWith("*"))

            {

                testo = "*" + testo;

            }

            if (!testo.EndsWith("*"))

            {

                testo = testo + "*";

            }

            pGraphics.FillRectangle(new SolidBrush(this.BackColor), 0, 0, this.Width, this.Height);

            int strettoCount = 0;

            int largoCount = 0;

            int BarreNereCount = 0;

            for (int i = 0; i < testo.Length; i++)

            {

                byte[] testoArray = caratteri[testo.Substring(i, 1)];

                foreach (byte insByte in testoArray)

                {

                    if (insByte == 1)

                    {

                        largoCount++;

                    }

                    else

                    {

                        strettoCount++;

                    }

                }

                if (i + 1 != testo.Length)

                {

                    BarreNereCount++;

                }

            }

            decimal larghezzaPerUnit = Math.Round(Convert.ToDecimal(this.Width) / Convert.ToDecimal(((largoCount * m_RapportoLargoStrettoBarre) + BarreNereCount + strettoCount)), 2);

            decimal margineSinistroCorrente = 0;

            for (int i = 0; i < testo.Length; i++)

            {

                byte[] insByteArray = caratteri[testo.Substring(i, 1)];

                int index = 0;

                foreach (byte insByte in insByteArray)

                {

                    if (index % 2 == 0)

                    {

                        pGraphics.FillRectangle(new SolidBrush(this.ForeColor), (float)margineSinistroCorrente, 0, (float)(insByte == 1 ? larghezzaPerUnit * m_RapportoLargoStrettoBarre : larghezzaPerUnit), this.Height);

 

                    }

                    margineSinistroCorrente += (insByte == 1 ? larghezzaPerUnit * m_RapportoLargoStrettoBarre : larghezzaPerUnit);

 

                    index++;

                }

                margineSinistroCorrente += larghezzaPerUnit;

            }

        }

 

        void Barcode39_TextChanged(object sender, EventArgs e)

        {

            this.Refresh();

        }

        void m_MenuSceltaRapida_ItemClicked(object sender, ToolStripItemClickedEventArgs e)

        {

            if (e.ClickedItem.Text == "Stampa")

            {

                PrintDocument stampa = new PrintDocument();

                stampa.PrintPage += new PrintPageEventHandler(stampa_PrintPage);

                stampa.Print();

            }

            else if (e.ClickedItem.Text == "Esporta")

            {

                m_MenuSceltaRapida.Close();

                SaveFileDialog SaveDialog = new SaveFileDialog();

                SaveDialog.ShowDialog();

                if (SaveDialog.FileName != "")

                {

                    Bitmap bitmap = new Bitmap(this.Width, this.Height);

                    this.DrawToBitmap(bitmap, new Rectangle(0, 0, this.Width, this.Height));

                    Image image = (Image)bitmap;

                    image.Save(SaveDialog.FileName + ".jpg", ImageFormat.Jpeg);

                }

            }

        }

        void stampa_PrintPage(object sender, PrintPageEventArgs e)

        {

            Bitmap bitmap = new Bitmap(this.Width, this.Height);

            this.DrawToBitmap(bitmap, new Rectangle(0, 0, this.Width, this.Height));

            Image image = (Image)bitmap;

            e.Graphics.DrawImage(image, new Point(10, 10));

 

        }

 

 

    }

}

Ora non ci resta che testare il nostro controllo.
Aggiungiamo nella form, un controllo di tipo Textbox, e nella parte superiore, posizioniamo il nostro controllo appena creato (dobbiamo prima compilare per verificare che non sono presenti errori) che troveremo nella barra degli strumenti (figura 1) inserendolo nella parte superiore della casella di testo, il tutto come mostrato in figura 2.



Figura 2 – i controlli.

Nell’evento TextChanged, dobbiamo impostare la proprietà Text, del controllo creato, con il valore della proprietà “Text” del controllo textbox.
Qui di seguito si riporta il frammento di codice.


VB.Net

Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged

        Barcode391.Text = TextBox1.Text

    End Sub

 

C#

private void textBox1_TextChanged(object sender, EventArgs e)

        {

            barcode391.Text = textBox1.Text;

        }



A questo punto una volta inserito il testo, possiamo salvare il risultato in formato jpg oppure rilevare da un lettore a codice a barre, oppure estrapolare il testo dall’immagine tramite i numerosi sito online che offrono un servizio gratuito di lettura a codice a barre.

Conclusioni

Abbiamo visto come realizzare un controllo personalizzato, che permette di generare dei codici a barre impostando un determinato testo.
Il controllo personalizzato, offre in anteprima la possibilità di vedere il risultato durante la digitazione del testo.

Nessun commento: