/*__________________________________________________Общедоступные_методы__________________________________________________*/ #region Public methods public Color GetColorFromX(int X) { double liner_pos = (X - g_left * Width) / (Width * g_width); if (liner_pos < 0) { return(left_col); } if (liner_pos > 1) { return(right_col); } gpolygon gpol_l = gpolygons.FindLast(arg => arg.cp.position <= liner_pos), gpol_r = gpolygons.Find(arg => arg.cp.position > liner_pos); Color left = left_col, right = right_col; double l_d = 0, r_d = 1; if (gpol_l != null) { left = gpol_l.cp.color; l_d = gpol_l.cp.position; } if (gpol_r != null) { right = gpol_r.cp.color; r_d = gpol_r.cp.position; } double value = (liner_pos - l_d) / (r_d - l_d); return(Color.FromArgb(left.R + (int)((right.R - left.R) * value), left.G + (int)((right.G - left.G) * value), left.B + (int)((right.B - left.B) * value))); }
public ColorGradientBar() { InitializeComponent(); m_left_color = Color.Black; m_right_color = Color.White; standart_of_gpolygon = new double[][] { new double[] { 0D, 0D }, new double[] { -gpol_width, gpol_height / 2D }, new double[] { -gpol_width, gpol_height }, new double[] { gpol_width, gpol_height }, new double[] { gpol_width, gpol_height / 2D }, new double[] { 0D, 0D } }; gpolygons = new List <gpolygon>();/*(new gpolygon[] { * new gpolygon(this,Color.Black, 30000 / 300000d), * new gpolygon(this,Color.Red, 1 / 3d), * new gpolygon(this,Color.Blue, 2 / 3d)});*/ g_left = 0; g_top = 0.15; g_width = 1; g_height = 1 - g_top * 2D; m_color_gradient_map = bitmap_liner; SizeChanged += size_changed_handler; KeyDown += (o, e) => { if (e.KeyCode == Keys.Delete && selected_gpol != null) { gpolygons.Remove(selected_gpol); selected_gpol = null; OnColorGradientChanged(); m_color_gradient_map = bitmap_liner; Invalidate(); } }; MouseDown += (obj, e) => { gpolygon taked = gpolygons.OrderByDescending(arg => arg.cp.position).FirstOrDefault(arg => arg.IsMyPoint(e.Location)); if (e.Clicks == 2) { if (taked != null) { ColorDialog cd = new ColorDialog(); cd.Color = taked.cp.color; if (cd.ShowDialog() == DialogResult.OK) { taked.cp.color = cd.Color; taked.cp.argb = cd.Color.ToArgb(); m_color_gradient_map = bitmap_liner; OnColorGradientChanged(); } } else { gpolygons.Add(new gpolygon(this, e.X)); OnColorGradientChanged(); } Invalidate(); } else if (taked != null) { taked.TakeAim(); } selected_gpol = taked; }; DoubleBuffered = true; }