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); } } }