Newer
Older
RbFreqStand / RbFreqStandMeasure / status / Coordinate.cs
yangqianqian on 13 Apr 2021 7 KB counter
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using Casic.Birmm.RbFreqStandMeasure.Properties;

namespace Casic.Birmm.RbFreqStandMeasure
{
    public partial class Coordinate : UserControl
    {
        private int x = 0;
        private int y = 0;

        private int padding = 20; // 坐标轴距离画布的边距

        [Description("角度值")]
        private int valueNow = 0;
        public int Value
        {
            get
            {
                return valueNow;
            }
            set
            {
                valueNow = value;
            }
        }

        /// <summary>
        /// 定义轴线长度
        /// </summary>
        private float diameter;

        /// <summary>
        /// 每个间隔值
        /// </summary>
        private int intervalValue;

        /// <summary>
        /// 仪表盘显示的最小值,默认为0
        /// </summary>
        private float minValue = 0;

        /// <summary>
        /// 仪表盘显示的最小值
        /// </summary>
        [Description("仪表盘显示的最小值")]
        public float MinValue
        {
            get
            {
                return minValue;
            }
            set
            {
                if (value >= MaxValue)
                {
                    MessageBox.Show("最小值不能超过最大值!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    minValue = 0;
                }
                else
                {
                    minValue = value;
                    //drawBackImage();
                }
            }

        }

        /// <summary>
        /// 仪表盘上显示的最大值,默认123。
        /// </summary>
        private float maxValue = 123;

        /// <summary>
        /// 仪表盘上显示的最大值
        /// </summary>
        [Description("仪表盘上显示的最大值")]
        public float MaxValue
        {
            get
            {
                return maxValue;
            }
            set
            {
                if (value <= MinValue)
                {
                    MessageBox.Show("最大值不能低于最小值!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    maxValue = 123;
                }
                else
                {
                    maxValue = value;
                    //drawBackImage();
                }
            }
        }

        // <summary>
        /// 仪表盘变换的值,默认为0;
        /// </summary>
        private float changeValue = 0;

        /// <summary>
        /// 仪表盘变换的值
        /// </summary>
        public float ChangeValue
        {
            get
            {
                return changeValue;
            }
            set
            {
                changeValue = value;
            }
        }

        /// <summary>
        /// 指针颜色
        /// </summary>
        private Color pinColor = Color.FromArgb(191, 148, 28);

        public Color PinColor
        {
            get
            {
                return pinColor;
            }
            set
            {
                pinColor = value;
            }
        }

        public int X { get => x; set => x = value; }
        public int Y { get => y; set => y = value; }

        public Coordinate()
        {
            InitializeComponent();
            //双缓存防止屏幕抖动
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer, true);
            this.SetStyle(ControlStyles.UserPaint, true);
            this.UpdateStyles();
            //设置背景颜色为透明
            this.BackColor = Color.Transparent;

            InitialCanvas();
        }

        //private int uintfontsize = 40;
        /// <summary>
        /// 初始化仪表盘画布
        /// </summary>
        public void InitialCanvas()
        {
            //对比控件的长高,以最小值为轴线长度
            if (this.Width > this.Height)
            {
                diameter = this.Height - 30;
            }
            else
            {
                diameter = this.Width - 30;
            }
           
            intervalValue = (int)(diameter / 3);//计算每个间隔之间的值
            
           
        }
        
        /// <summary>
        /// 画图
        /// </summary>
        /// <param name="g"></param>
        public void DrawPin(Graphics g)
        {
            Bitmap bit = new Bitmap(this.Width, this.Height);
            Graphics gp = Graphics.FromImage(bit);
            gp.SmoothingMode = SmoothingMode.HighQuality;

            gp.DrawLine(new Pen(Color.FromArgb(139, 129, 76)) { DashStyle = DashStyle.Custom }, new Point(padding, this.Height / 2), new Point(this.Width - padding, this.Height / 2));

            gp.DrawLine(new Pen(Color.FromArgb(139, 129, 76)), new Point(this.Width / 2, padding), new Point(this.Width / 2 - 5, this.Height - padding));

            //Color color = Color.FromArgb(139, 129, 76);
            Color color = Color.RoyalBlue;
            SolidBrush brush = new SolidBrush(color);
            Font scaleFont = new Font(new FontFamily("微软雅黑"), 9, FontStyle.Regular);
            gp.DrawString("W", scaleFont, brush, new Point(0, this.Height / 2 - 9));
            gp.DrawString("N", scaleFont, brush, new Point(this.Width / 2 - 7, 2));
            gp.DrawString("E", scaleFont, brush, new Point(this.Width - padding + 2 , this.Height / 2 - 8));
            gp.DrawString("S", scaleFont, brush, new Point(this.Width / 2 - 10, this.Height - padding));

            int inter = 50; // 圆圈之间的间隔
            Pen dashPen = new Pen(Color.Red, 2)
            {
                DashStyle = DashStyle.Custom,
                DashPattern = new float[] { 3f, 1f }
            };
            int offset = padding + 5;
            gp.DrawEllipse(dashPen, offset, offset, this.Width - offset * 2, this.Width - offset * 2);//画椭圆的方法,x坐标、y坐标、宽、高,如果是100,则半径为50
            gp.DrawEllipse(new Pen(Color.FromArgb(139, 129, 76)), offset + inter, offset + inter, this.Width - offset * 2 - 2* inter, this.Width - offset * 2 - 2 * inter);//画椭圆的方法,x坐标、y坐标、宽、高,如果是100,则半径为50
            gp.DrawEllipse(new Pen(Color.FromArgb(139, 129, 76)), offset + inter * 3, offset + inter*3, this.Width - offset * 2 - 6 * inter, this.Width - offset * 2 - 6 * inter);//画椭圆的方法,x坐标、y坐标、宽、高,如果是100,则半径为50

            // 画点
            brush = new SolidBrush(Color.Gray);
            X = this.Width - padding - offset - inter;
            Y = this.Height/2;
            gp.DrawString("30", scaleFont, brush, new Point(X, Y));
            //gp.DrawImage((Bitmap)Resources.ResourceManager.GetObject("USA"), X, Y);

            X = X-50*2;
            gp.DrawString("60", scaleFont, brush, new Point(X, Y));
            //gp.DrawImage((Bitmap)Resources.ResourceManager.GetObject("CHN"), X, Y);

            g.DrawImage(bit, 0, 0);
            gp.Dispose();
        }       

        private void CoordinateUc_Load(object sender, EventArgs e)
        {
            InitialCanvas();
        }

        private void CoordinateUc_Resize(object sender, EventArgs e)
        {
            InitialCanvas();
        }

        private void CoordinateUc_Paint(object sender, PaintEventArgs e)
        {
            DrawPin(e.Graphics);
        }
    }
}