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:
Posta un commento