CReazione di un controllo Barcode in VB.Net e C#

Realizzazione di un controllo personalizzato riguardante la generazione di un barcode tramite il linguaggio VB.Net e C#.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

 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.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
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
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 rest ache 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) inserenedolo 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.