Nadesłany przez Tomasz Lubiński, 20 listopada 2019 21:36
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
BC412/Form1.cs:
//Kod kreskowy BC412 //(c) 2019 by Tomasz Lubinski //www.algorytm.org 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.Imaging; namespace Barcodes.BC412 { public partial class Form1 : Form { private readonly static char[] BC412signs = { '0', 'R', '9', 'G', 'L', 'V', 'H', 'A', '8', 'E', 'Z', '4', 'N', 'T', 'S', '1', 'J', '2', 'Q', '6', 'C', '7', 'D', 'Y', 'K', 'B', 'U', 'I', 'X', '3', 'F', 'W', 'P', '5', 'M' }; private readonly static int[,] BC412Spaces = { {1, 1, 1, 5}, {3, 1, 2, 2}, {1, 3, 1, 3}, {2, 1, 2, 3}, {2, 2, 3, 1}, {3, 3, 1, 1}, {2, 1, 3, 2}, {1, 3, 2, 2}, {1, 2, 4, 1}, {1, 5, 1, 1}, {5, 1, 1, 1}, {1, 1, 5, 1}, {2, 3, 2, 1}, {3, 2, 1, 2}, {3, 1, 2, 2}, {1, 1, 2, 4}, {2, 2, 1, 3}, {1, 1, 3, 3}, {3, 1, 1, 3}, {1, 2, 2, 3}, {1, 4, 1, 2}, {1, 2, 3, 2}, {1, 4, 2, 1}, {4, 2, 1, 1}, {2, 2, 2, 2}, {1, 3, 3, 1}, {3, 2, 2, 1}, {2, 1, 4, 1}, {4, 1, 2, 1}, {1, 1, 4, 2}, {2, 1, 1, 4}, {4, 1, 1, 2}, {2, 4, 1, 1}, {1, 2, 1, 4}, {2, 3, 1, 2} }; private readonly static int start = 2; private readonly static int stop = 1; /// <summary> /// Zainicjuj /// </summary> public Form1() { InitializeComponent(); pictureBox.Image = new Bitmap(pictureBox.Width, pictureBox.Height, PixelFormat.Format24bppRgb); System.Drawing.SolidBrush whiteBrush = new System.Drawing.SolidBrush(System.Drawing.Color.White); System.Drawing.Graphics graphics = Graphics.FromImage(pictureBox.Image); graphics.FillRectangle(whiteBrush, new Rectangle(0, 0, pictureBox.Width, pictureBox.Height)); pictureBox.Refresh(); whiteBrush.Dispose(); graphics.Dispose(); } /// <summary> /// Sprawdza czy podany txt mozna zakodowac BC412 /// </summary> /// <param name="txt">tekst do zakodowania</param> /// <returns>true jezeli mozna zakodowac, false w przeciwnym razie</returns> public bool check(string txt) { for (int i = 0; i < txt.Length; i++) { if (checkLetter(txt[i]) == false) return false; } return true; } /// <summary> /// Sprawdza czy podany znak mozna zakodowac BC412 /// </summary> /// <param name="ch">znak do zakodowania</param> /// <returns>true jezeli mozna zakodowac, false w przeciwnym razie</returns> private bool checkLetter(char ch) { for (int i = 0; i < BC412signs.Length; i++) { if (BC412signs[i] == ch) return true; } return false; } /// <summary> /// Zwraca wartosc danego znaku /// </summary> /// <param name="ch">znak</param> /// <returns>wartosc danego znaku</returns> private int getLetterValue(char ch) { for (int i = 0; i < BC412signs.Length; i++) if (BC412signs[i] == ch) return i; return -1; } /// <summary> /// Zwraca cyfre kontrolna dla danego ciagu /// </summary> /// <param name="code">kodowany ciag</param> /// <returns>cyfra kontrolna dla danego ciagu</returns> private int checkDigit(string code) { int sum = 0; for (int i = 0; i < code.Length; i++) sum += getLetterValue(code[i]); return (sum % 35); } /// <summary> /// Generuj BC412 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Generate_Click(object sender, EventArgs e) { //Zainicjuj narzedzia do rysowania System.Drawing.SolidBrush whiteBrush = new System.Drawing.SolidBrush(System.Drawing.Color.White); System.Drawing.SolidBrush blackBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black); System.Drawing.Graphics graphics = Graphics.FromImage(pictureBox.Image); Font drawFont = new Font("Arial", 10); //Wyczysc obszar rysowania graphics.FillRectangle(whiteBrush, new Rectangle(0, 0, pictureBox.Width, pictureBox.Height)); //Sprawdz czy podany ciag mozna zakodowac string code = Code.Text; //Zamien wszystkie wystapienia 'O' na '0' code = code.Replace('O', '0'); if (check(code) == false) { MessageBox.Show("Nieprawidłowe znaki!", "Bład", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } //Wygeneruj i narysuj kod int[] bars = generateBars(code); int pos = 10; for (int i = 0; i < bars.Length; i++) { //Narysuj pasek i przesun sie o jego wielokrotnosc graphics.FillRectangle(blackBrush, pos, 10, 2, 90); pos += 2 + bars[i]*2; } //Wypisz kodowany ciag pod kodem kreskowym for (int i = 0; i < code.Length; i++) { graphics.DrawString(code.Substring(i, 1), drawFont, blackBrush, i * 24 + 20, 102); } //Odswiez pictureBox.Refresh(); //Zwolinij zasoby whiteBrush.Dispose(); blackBrush.Dispose(); graphics.Dispose(); } /// <summary> /// Generuje kod kreskowy /// </summary> /// <param name="code">string do zakodowania kodem kreskowym</param> /// <returns>zwraca szerokosc kolejnych przerw</returns> private int[] generateBars(string code) { int[] bars = new int[4 * (code.Length + 1) + 2]; //Dodaj znak start/stop bars[0] = start; //Dodaj kolejne znaki for (int i = 0; i < code.Length; i++) { int letterValue = getLetterValue(code[i]); for (int j = 0; j < 4; j++) { bars[i * 4 + 1 + j] = BC412Spaces[letterValue, j]; } } //Dodaj cyfre kontrolna int checkDigitValue = checkDigit(code); for (int j = 0; j < 4; j++) { bars[4 * code.Length + 1 + j] = BC412Spaces[checkDigitValue, j]; } //Dodaj znak start/stop bars[4 * (code.Length + 1) + 1] = stop; return bars; } } }