如何采用C#绘制39条形码

来源:互联网 发布:广州雷霆网络刀塔世纪 编辑:程序博客网 时间:2024/06/12 01:38

 

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

namespace CjLibrary
{

    public enum AlignType
    {
        Left = 0,
        Right = 1,
        Center = 2
    }

    public class CjBarCode
    {
        private AlignType align;

        public  AlignType Align
        {
            get { return align; }
            set { align = value; }
        }
        private int leftMargin = 10;

        public int LeftMargin
        {
            get { return leftMargin; }
            set { leftMargin = value; }
        }
        private int topMargin = 10;

        public int TopMargin
        {
            get { return topMargin; }
            set { topMargin = value; }
        }
        private int barcodeHeight = 50;

        public int BarcodeHeight
        {
            get { return barcodeHeight; }
            set { barcodeHeight = value; }
        }

        private string headerText="浙江绍兴";

        public string HeaderText
        {
            get { return headerText; }
            set { headerText = value; }
        }


        private string barcodeText = "";

        public string BarcodeText
        {
            get { return barcodeText; }
            set { barcodeText = value;           }
        }
       

        private bool showHeader;

        public bool ShowHeader
        {
            get { return showHeader; }
            set { showHeader = value; }
        }

        private bool showFooter;

        public bool ShowFooter
        {
            get { return showFooter; }
            set { showFooter = value; }
        }

      
        private int headerFontSize;

        public int HeaderFontSize
        {
            get { return headerFontSize; }
            set { headerFontSize = value; }
        }
        private int footerFontSize;

        public int FooterFontSize
        {
            get { return footerFontSize; }
            set { footerFontSize = value; }
        }
        private string headerFontFamily;

        public string HeaderFontFamily
        {
            get { return headerFontFamily; }
            set { headerFontFamily = value; }
        }
        private string footerFontFamily;

        public string FooterFontFamily
        {
            get { return footerFontFamily; }
            set { footerFontFamily = value; }
        }

        protected Font headerFont=null;
        protected Font footerFont=null;
       
        public CjBarCode()
        {
            align = AlignType.Center;
            headerFontFamily = "Courier";
            footerFontFamily = "Courier";
            headerFontSize = 9;
            footerFontSize = 9;
            headerFont = new Font(headerFontFamily, headerFontSize);
            footerFont = new Font(footerFontFamily, footerFontSize);
           
        }
      
        protected virtual void DrawBitmap(Graphics g, Rectangle rects)
        {

            SolidBrush brush = new SolidBrush(Color.PowderBlue);
            g.FillRectangle(brush, rects);
        }
        protected virtual void DrawText(string text,Graphics g, Rectangle rects)
        {
            SolidBrush brush = new SolidBrush(Color.PowderBlue);
            g.FillRectangle(brush, rects);
        }


    }


    public class CjBarCode39 : CjBarCode
    {

        private double wideToNarrowRatio = 3.0;

        public double WideToNarrowRatio
        {
            get { return wideToNarrowRatio; }
            set { wideToNarrowRatio = value; }
        }
        private int  weight = 1;

        public int Weight
        {
            get { return weight; }
            set { weight = value; }
        }
        /// <summary>
        /// 39条码中能使用的字符
        /// </summary>
        private String alphabet39 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%*";

        private String[] coded39Char =
  {
   /* 0 */ "001100100",
   /* 1 */ "100010100",
   /* 2 */ "010010100",
   /* 3 */ "110000100",
   /* 4 */ "001010100",
   /* 5 */ "101000100",
   /* 6 */ "011000100",
   /* 7 */ "000110100",
   /* 8 */ "100100100",
   /* 9 */ "010100100",
   /* A */ "100010010",
   /* B */ "010010010",
   /* C */ "110000010",
   /* D */ "001010010",
   /* E */ "101000010",
   /* F */ "011000010",
   /* G */ "000110010",
   /* H */ "100100010",
   /* I */ "010100010",
   /* J */ "001100010",
   /* K */ "100010001",
   /* L */ "010010001",
   /* M */ "110000001",
   /* N */ "001010001",
   /* O */ "101000001",
   /* P */ "011000001",
   /* Q */ "000110001",
   /* R */ "100100001",
   /* S */ "010100001",
   /* T */ "001100001",
   /* U */ "100011000",
   /* V */ "010011000",
   /* W */ "110001000",
   /* X */ "001011000",
   /* Y */ "101001000",
   /* Z */ "011001000",
   /* - */ "000111000",
   /* . */ "110000100",
   /*' '*/ "011000100",
   /* $ */ "010101000",
   /* / */ "010100010",
   /* + */ "010001010",
   /* % */ "100101000",
   /* * */ "001101000"
  };
        public CjBarCode39()
        {
            BarcodeText = "1234";
        }
        /// <summary>
        /// 为了使得条形码居中先要计算条形码的Left和Top坐标
        /// </summary>
        /// <returns></returns>
        private int getX()
        {
            int currentLocation = 0;
            string strBarcode = "*" + BarcodeText.ToUpper() + "*";
            for (int i = 0; i < strBarcode.Length; i++)
            {
               string  encodedString = coded39Char[alphabet39.IndexOf(strBarcode[i])];

                for (int j = 0; j < 5; j++)
                {

                    if (encodedString[j] == '0')
                    {
                        currentLocation += weight;
                    }
                    else
                    {
                        currentLocation += 3 * weight;
                    }
                    //画第6个     5   白条
                    if ((j + 5) < 9)
                    {
                        if (encodedString[j + 5] == '0')
                        {
                            currentLocation += weight;
                        }
                        else
                        {
                            currentLocation += 3 * weight;
                        }
                    }
                }
                currentLocation += weight;
            }
            return currentLocation;
        }
        /// <summary>
        /// 显示条形码
        /// </summary>
        /// <param name="g">GDI+</param>
        /// <param name="rects">画图区域</param>
        protected override void DrawBitmap(Graphics g, Rectangle rects)
        {
            if (BarcodeText == "") return;
            string strBarcode = "*" + BarcodeText.ToUpper() + "*";
            //string strBarcode =  BarcodeText.ToUpper() ;
            String encodedString = "";
            int currentLocation =(rects.Width- getX())/2;
            SolidBrush blackBrush = new SolidBrush(Color.Black);
            SolidBrush witeBrush = new SolidBrush(Color.White);           
            int yTop = rects.Y;
            for (int i = 0; i < strBarcode.Length; i++)
            {
                encodedString = coded39Char[alphabet39.IndexOf(strBarcode[i])];

                for (int j = 0; j < 5; j++)
                {

                    if (encodedString[j] == '0')
                    {
                        Rectangle re1 = new Rectangle(currentLocation, yTop, weight, BarcodeHeight);
                        g.FillRectangle(blackBrush, re1);
                        currentLocation += weight;
                    }
                    else
                    {
                        Rectangle re1 = new Rectangle(currentLocation, yTop, 3 * weight, BarcodeHeight);
                        g.FillRectangle(blackBrush, re1);
                        currentLocation += 3 * weight;
                    }
                    //画第6个     5   白条
                    if ((j + 5) < 9)
                    {
                        if (encodedString[j + 5] == '0')
                        {
                            Rectangle re1 = new Rectangle(currentLocation, yTop, weight, BarcodeHeight);
                            g.FillRectangle(witeBrush, re1);
                            currentLocation += weight;
                        }
                        else
                        {
                            Rectangle re1 = new Rectangle(currentLocation, yTop, 3 * weight, BarcodeHeight);
                            g.FillRectangle(witeBrush, re1);
                            currentLocation += 3 * weight;
                        }
                    }
                }
                Rectangle re2 = new Rectangle(currentLocation, yTop, weight, BarcodeHeight);
               g.FillRectangle(witeBrush, re2);
                currentLocation += weight;
            }


        }

        /// <summary>
        /// 显示条形码和文字
        /// </summary>
        /// <param name="g"></param>
        /// <param name="rects"></param>
        public void DrawBarcode(Graphics g, Rectangle rects)
        {
            SizeF hsize = g.MeasureString(HeaderText, this.headerFont);
            SizeF fsize = g.MeasureString(BarcodeText, this.footerFont);
            //HeadText
            Rectangle t = new Rectangle();
            t = rects;
            t.Height = (int)hsize.Height;
            t.X = (rects.Width - (int)hsize.Width) / 2;
            DrawText(HeaderText, g, t);
            //FootText
            Rectangle b = new Rectangle();
            b = rects;
            b.Y = rects.Height - (int)fsize.Height;
            b.X = (rects.Width - (int)fsize.Width) / 2;
            b.Height = (int)fsize.Height;
            DrawText("*" + BarcodeText + "*", g, b);
            //BarCode
            Rectangle m = new Rectangle();
            m = rects;
            m.Y = t.Height;
            m.Height = rects.Height - t.Height - b.Height;
            this.BarcodeHeight = m.Height;
            DrawBitmap(g, m);
        }
        /// <summary>
        /// 文本显示
        /// </summary>
        /// <param name="text"></param>
        /// <param name="g"></param>
        /// <param name="rects"></param>
        protected override void DrawText(string text, Graphics g, Rectangle rects)
        {
            g.DrawString(text, this.headerFont, Brushes.Black, rects);
        }

 

    }
}

 

原创粉丝点击