/// <summary>Returns the measurements of a ColourWheel that fits in the given width/height/orientation</summary> public static Measurements Measure(int width, int height, EParts parts, int slider_width, bool vertical) { bool drawv = (parts & EParts.VSlider) != 0; bool drawa = (parts & EParts.ASlider) != 0; int slider_space = 0 + (drawv ? slider_width * 3 / 2 : 0) + (drawa ? slider_width * 3 / 2 : 0); int w = Math.Max(0, width - (vertical ? 0 : slider_space)); int h = Math.Max(0, height - (vertical ? slider_space : 0)); int min = Math.Min(w, h); var meas = new Measurements(); meas.Width = min + (vertical ? 0 : slider_space); meas.Height = min + (vertical ? slider_space : 0); meas.Radius = min * 0.5f; meas.Centre = new Point((int)Math.Ceiling(meas.Radius), (int)Math.Ceiling(meas.Radius)); meas.Wheel = new Rectangle(0, 0, meas.Centre.X * 2, meas.Centre.Y * 2); using (var bm = new Bitmap(1, 1)) using (var gfx = Graphics.FromImage(bm)) { gfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; Func <Graphics, int, int, string, Rectangle> LabelBounds = (g, x, y, label) => { var sz = g.MeasureString(label, SystemFonts.DefaultFont, slider_width / 2); return(new Rectangle( (int)(x + (vertical ? 0f : (slider_width - sz.Width) * 0.5f)), (int)(y + (vertical ? (slider_width - sz.Height) * 0.5f : 0f)), (int)Math.Ceiling(sz.Width), (int)Math.Ceiling(sz.Height))); }; Func <int, int, Rectangle, Rectangle> SliderBounds = (x, y, label_bounds) => { return(new Rectangle( x + (vertical ? label_bounds.Width + 2 : 0), y + (vertical ? 0 : label_bounds.Height + 2), vertical ? meas.Width - label_bounds.Width - 2 : slider_width, vertical ? slider_width : meas.Height - label_bounds.Height - 2)); }; var ofs = (vertical ? meas.Wheel.Width : meas.Wheel.Height) + slider_width / 5; if ((parts & EParts.VSlider) != 0) { meas.VLabel = LabelBounds(gfx, vertical ? 0 : ofs, vertical ? ofs : 0, ValueLabel); meas.VSlider = SliderBounds(vertical ? 0 : ofs, vertical ? ofs : 0, meas.VLabel); ofs += slider_width * 3 / 2; } if ((parts & EParts.ASlider) != 0) { meas.ALabel = LabelBounds(gfx, vertical ? 0 : ofs, vertical ? ofs : 0, AlphaLabel); meas.ASlider = SliderBounds(vertical ? 0 : ofs, vertical ? ofs : 0, meas.ALabel); } return(meas); } }
protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); Capture = false; switch (m_selected_part) { case EParts.Wheel: SelectHueAndSaturation(e.X, e.Y); break; case EParts.VSlider: SelectBrightness(e.X, e.Y); break; case EParts.ASlider: SelectAlpha(e.X, e.Y); break; } RaiseColourSelection(e); m_selected_part = EParts.None; }
protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); if ((m_selected_part = PartHitTest(e.X, e.Y)) == EParts.None) { return; } RaiseColourSelection(e); switch (m_selected_part) { case EParts.Wheel: SelectHueAndSaturation(e.X, e.Y); break; case EParts.VSlider: SelectBrightness(e.X, e.Y); break; case EParts.ASlider: SelectAlpha(e.X, e.Y); break; } Capture = true; }
protected override void OnMouseUp(MouseButtonEventArgs e) { base.OnMouseUp(e); var pt = e.GetPosition(this); ReleaseMouseCapture(); switch (m_selected_part) { case EParts.Wheel: SelectHueAndSaturation(pt); break; case EParts.VSlider: SelectBrightness(pt); break; case EParts.ASlider: SelectAlpha(pt); break; } ColourSelection?.Invoke(this, e); m_selected_part = EParts.None; }
protected override void OnMouseDown(MouseButtonEventArgs e) { base.OnMouseDown(e); var pt = e.GetPosition(this); m_selected_part = PartHitTest(pt.X, pt.Y); if (m_selected_part == EParts.None) { return; } ColourSelection?.Invoke(this, e); switch (m_selected_part) { case EParts.Wheel: SelectHueAndSaturation(pt); break; case EParts.VSlider: SelectBrightness(pt); break; case EParts.ASlider: SelectAlpha(pt); break; } CaptureMouse(); }