地磅称量系统之(57) 自定义七段数字图形显示屏(SevenSegmentDigitGraphicsDisplay)控件我又把它称之为LCD控件

     

让知识更加联贯 让技术走进生活
我的博客        我的程序 我的网络
               ------郑紫至
               E-mail:zhengzizhi@yahoo.com.cn
地磅称量系统
57. 在WinApp项目下新建LCD控件并设置BackColor为Black 区域大小Size为(448, 64)
然后可以设计代码了,完整的代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WinApp
{
    public partial class LCD : UserControl
    {
        public LCD()
        {
            SetStyle(ControlStyles.UserPaint | ControlStyles.DoubleBuffer
                     | ControlStyles.AllPaintingInWmPaint | ControlStyles.ResizeRedraw
                     | ControlStyles.SupportsTransparentBackColor, true);
            this.UpdateStyles();
            Init();
            InitializeComponent();
        }
        System.Drawing.Graphics g = null;
        private void Init()
        {
            m_Bitmap = new System.Drawing.Bitmap(this.Width, this.Height);
            g = Graphics.FromImage(m_Bitmap);
            g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
 
        }
 
        //LCD 显示的内容
        string _LCDShowStringValue = String.Empty;
        public string LCDShowStringValue
        {
            get { return this._LCDShowStringValue; }
            set
            {
                if (this._LCDShowStringValue != value)
                {
 
                    this._LCDShowStringValue = value;
                    this.Invalidate();
                }
            }
        }
 
        int _LCDStringWidth;
        public int LCDStringWidth
        {
            get { return this._LCDStringWidth; }
        }
 
        int _LCDStringHeight;
        public int LCDStringHeight
        {
            get { return this._LCDStringHeight; }
        }
        //LCD 内显示字体颜色
        System.Drawing.Color _LCDShowFontColor = System.Drawing.Color.Lime;
        public System.Drawing.Color LCDShowFontColor
        {
            get { return this._LCDShowFontColor; }
            set
            {
                this._LCDShowFontColor = value;
                this.Invalidate();
            }
        }
 
        System.Drawing.Bitmap m_Bitmap = null;
        protected override void OnPaint(PaintEventArgs e)
        {
            m_Bitmap = DrawLCD();
            System.Drawing.Graphics grfx = e.Graphics;
            grfx.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            grfx.DrawImageUnscaled(m_Bitmap, 0, 0);
        }
 
        public System.Drawing.Bitmap DrawLCD()
        {
            return this.DrawLCD(this.ClientRectangle);
        }
        //LCD 显示字体是否有阴影,默认无阴影
        bool _IsDrawShadow = false;
        public bool LCDIsDrawShow
        {
            get { return this._IsDrawShadow; }
            set { this._IsDrawShadow = value; }
        }
        public System.Drawing.Bitmap DrawLCD(System.Drawing.Rectangle destRect)
        {
            m_Bitmap = new Bitmap(destRect.Width, destRect.Height);
            System.Drawing.Graphics grfx = System.Drawing.Graphics.FromImage(m_Bitmap);
            grfx.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            grfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
            grfx.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
 
            SevenSegmentDigitGraphicsDisplay ssdgd = new SevenSegmentDigitGraphicsDisplay(grfx);
            ssdgd.IsDrawShadow = this._IsDrawShadow;
            System.Drawing.Drawing2D.GraphicsState gs = grfx.Save();
            grfx.TranslateTransform(destRect.X, destRect.Y);
            string StringLCD = (this.LCDShowStringValue == null ? "" : this.LCDShowStringValue);
 
            System.Drawing.SizeF sizef = ssdgd.MeasureString(StringLCD, Font);
            float fscale = Math.Min(destRect.Width / sizef.Width, destRect.Height / sizef.Height);
            Font font = new Font(Font.FontFamily, fscale * Font.SizeInPoints);
 
            sizef = ssdgd.MeasureString(StringLCD, font);
            this._LCDStringWidth = (int)sizef.Width;
            this._LCDStringHeight = (int)sizef.Height;
 
            ssdgd.MeasureString(StringLCD, font,
                new System.Drawing.SolidBrush(this._LCDShowFontColor),
                (destRect.Width - sizef.Width) / 2, (destRect.Height - sizef.Height) / 2);
            grfx.Restore(gs);
            return m_Bitmap;
        }
    }
    public class SevenSegmentDigitGraphicsDisplay
    {
        System.Drawing.Graphics grfx;
        System.Drawing.Brush _brush = System.Drawing.Brushes.Black;
        bool _IsDrawShadow = true;
        System.Drawing.Color _ShadowColor =
 System.Drawing.Color.FromArgb(60, System.Drawing.Color.White);
        System.Drawing.Brush _ShadowBrush = null;
 
        static byte[,] bySegment ={
          { 1, 1, 1, 0, 1, 1, 1 }, // 0    
          { 0, 0, 1, 0, 0, 1, 0 }, // 1    
          { 1, 0, 1, 1, 1, 0, 1 }, // 2   
          { 1, 0, 1, 1, 0, 1, 1 }, // 3    
          { 0, 1, 1, 1, 0, 1, 0 }, // 4     
          { 1, 1, 0, 1, 0, 1, 1 }, // 5   
          { 1, 1, 0, 1, 1, 1, 1 }, // 6    
          { 1, 0, 1, 0, 0, 1, 0 }, // 7    
          { 1, 1, 1, 1, 1, 1, 1 }, // 8   
          { 1, 1, 1, 1, 0, 1, 1 } // 9     
 
                               };
        readonly System.Drawing.Point[][] SevenSegmentDigitGraphics =
new System.Drawing.Point[7][];
 
        public bool IsDrawShadow
        {
            get { return this._IsDrawShadow; }
            set { this._IsDrawShadow = value; }
        }
 
        public SevenSegmentDigitGraphicsDisplay(System.Drawing.Graphics grfx)
        {
            this.grfx = grfx;
            SevenSegmentDigitGraphics[0] = new Point[] {
                                           new Point( 3, 2), new Point(39, 2),
                                           new Point(31, 10), new Point(11, 10)
                                      };
 
            SevenSegmentDigitGraphics[1] = new Point[] {
                                           new Point( 2, 3), new Point(10, 11),
                                           new Point(10, 31), new Point( 2, 35)
                                      };
 
            SevenSegmentDigitGraphics[2] = new Point[] {
                                           new Point(40, 3), new Point(40, 35),
                                           new Point(32, 31), new Point(32, 11)
                                      };
 
            SevenSegmentDigitGraphics[3] = new Point[] {
                                           new Point( 3, 36), new Point(11, 32),
                                           new Point(31, 32), new Point(39, 36),
                                           new Point(31, 40), new Point(11, 40)
                                      };
 
            SevenSegmentDigitGraphics[4] = new Point[] {
                                           new Point( 2, 37), new Point(10, 41),
                                           new Point(10, 61), new Point( 2, 69)
                                      };
 
            SevenSegmentDigitGraphics[5] = new Point[] {
                                           new Point(40, 37), new Point(40, 69),
                                           new Point(32, 61), new Point(32, 41)
                                      };
 
            SevenSegmentDigitGraphics[6] = new Point[] {
                                           new Point(11, 62), new Point(31, 62),
                                           new Point(39, 70), new Point( 3, 70)
                                      };
        }
 
        public System.Drawing.SizeF MeasureString(string LCDStringValue,
 System.Drawing.Font font)
        {
            System.Drawing.SizeF sizef = new System.Drawing.SizeF(0,
grfx.DpiX * font.SizeInPoints / 72);
 
            for (int i = 0; i < LCDStringValue.Length; i++)
            {
                if (char.IsDigit(LCDStringValue[i]))
                {
                    sizef.Width += 42 * grfx.DpiX * font.SizeInPoints / 72 / 72;
                }
                else if (LCDStringValue[i] == '-')
                {
                    sizef.Width += 42 * grfx.DpiX * font.SizeInPoints / 72 / 72;
                }
                else if (LCDStringValue[i] == ':')
                {
                    sizef.Width += 20 * grfx.DpiX * font.SizeInPoints / 72 / 72;
                }
                else if (LCDStringValue[i] == ' ')
                {
                    sizef.Width += 36 * grfx.DpiX * font.SizeInPoints / 72 / 72;
                }
                else if (LCDStringValue[i] == '.')
                {
                    sizef.Width += 20 * grfx.DpiX * font.SizeInPoints / 72 / 72;
                }
            }
            return sizef;
        }
 
        public void MeasureString(string LCDStringValue, System.Drawing.Font font,
        System.Drawing.Brush brush, float x, float y)
        {
            this._brush = brush;
            this._ShadowBrush =
 new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(40,
                ((System.Drawing.SolidBrush)this._brush).Color));
            for (int i = 0; i < LCDStringValue.Length; i++)
            {
                if (char.IsDigit(LCDStringValue[i]))
                {
                    x = Number(LCDStringValue[i] - '0', font, brush, x, y);
                }
                else if (LCDStringValue[i] == '-')
                {
                    x = MinusSign(font, brush, x, y);
                }
                else if (LCDStringValue[i] == ':')
                {
                    x = Colon(font, brush, x, y);
                }
                else if (LCDStringValue[i] == ' ')
                {
                    x = DrawSpace(font, brush, x, y);
                }
                else if (LCDStringValue[i] == '.')
                {
                    x = DrawDot(font, brush, x, y);
                }
            }
        }
 
        private float Number(int num, System.Drawing.Font font, System.Drawing.Brush brush,
        float x, float y)
        {
            for (int i = 0; i < SevenSegmentDigitGraphics.Length; i++)
            {
                if (this._IsDrawShadow)
                {
                    Fill(SevenSegmentDigitGraphics[i], font, this._ShadowBrush, x, y);
                }
                if (bySegment[num, i] == 1)
                {
                    Fill(SevenSegmentDigitGraphics[i], font, brush, x, y);
                }
            }
            return x + 42 * grfx.DpiX * font.SizeInPoints / 72 / 72;
        }
 
        private float MinusSign(Font font, Brush brush, float x, float y)
        {
            Fill(SevenSegmentDigitGraphics[3], font, brush, x, y);
            return x + 42 * grfx.DpiX * font.SizeInPoints / 72 / 72;
        }
 
        private float DrawSpace(Font font, Brush brush, float x, float y)
        {
            return x + 36 * grfx.DpiX * font.SizeInPoints / 72 / 72;
        }
 
        private float Colon(Font font, Brush brush, float x, float y)
        {
            Point[][] point = new Point[2][];
 
            point[0] = new Point[] {
                                           new Point( 4, 12), new Point( 16, 12),
                                           new Point(16, 24), new Point( 4, 24)
                                      };
 
            point[1] = new Point[] {
                                           new Point( 4, 50), new Point( 16, 50),
                                           new Point(16, 62), new Point( 4, 62)
                                       };
 
            for (int i = 0; i < point.Length; i++)
            {
                Fill(point[i],
 
                    font, brush, x, y);
            }
 
            return x + 20 * grfx.DpiX * font.SizeInPoints / 72 / 72;
        }
 
        private float DrawDot(Font font, Brush brush, float x, float y)
        {
            Point[][] point = new Point[1][];
            point[0] = new Point[] {
                                           new Point( 4, 50), new Point( 16, 50),
                                           new Point(16, 62), new Point( 4, 62)
                                      };
 
 
            Fill(point[0], font, brush, x, y);
 
            return x + 20 * grfx.DpiX * font.SizeInPoints / 72 / 72;
        }
 
        private void Fill(System.Drawing.Point[] SevenSegmentDigitGraphics, System.Drawing.Font font,System.Drawing.Brush brush, float x, float y)
        {
            System.Drawing.PointF[] pointf =
new System.Drawing.PointF[SevenSegmentDigitGraphics.Length];
            for (int i = 0; i < SevenSegmentDigitGraphics.Length; i++)
            {
                pointf[i].X = x +
 SevenSegmentDigitGraphics[i].X * grfx.DpiX * font.SizeInPoints / 72 / 72;
                pointf[i].Y = y +
 SevenSegmentDigitGraphics[i].Y * grfx.DpiY * font.SizeInPoints / 72 / 72;
            }
            grfx.FillPolygon(brush, pointf);
        }
    }
}
 
 
阅读上面的代码可能你看起来很费劲 七段图形的每个点的坐标为什么要定义为哪个大小的数字?
请参考我提供的在设计编码之前的模拟草图 草图如下所示:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值