{"id":206,"date":"2020-08-16T08:07:34","date_gmt":"2020-08-16T08:07:34","guid":{"rendered":"https:\/\/michaeljohnsteiner.com\/?p=206"},"modified":"2020-08-16T08:07:35","modified_gmt":"2020-08-16T08:07:35","slug":"ellipse-cs","status":"publish","type":"post","link":"https:\/\/michaeljohnsteiner.com\/index.php\/2020\/08\/16\/ellipse-cs\/","title":{"rendered":"Ellipse.cs"},"content":{"rendered":"\n<p>Ellipse Control<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using System;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Windows.Forms;\npublic class Ellipse : Control\n{\n    private readonly Color[] _surroundcolors        = {Color.FromArgb(0, 135, 206, 250)};\n    private          Color   _centerreflectioncolor = Color.FromArgb(180, 135, 206, 250);\n    private          Color   _color                 = Color.DodgerBlue;\n    private          Color   _lightColor, _darkColor, _darkDarkColor;\n    private          bool    _on           = true;\n    private          bool    _reflectionon = true;\n    public Ellipse()\n    {\n        SetStyle(ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.ResizeRedraw | ControlStyles.UserPaint | ControlStyles.SupportsTransparentBackColor, true);\n        Name           = \"Ellipse\";\n        Size           = new Size(10, 10);\n        _lightColor    = ControlPaint.Light(Color.DodgerBlue, .4f);\n        _darkColor     = ControlPaint.Dark(_lightColor, .2f);\n        _darkDarkColor = ControlPaint.DarkDark(_lightColor);\n    }\n    [DefaultValue(typeof(Color), \"30, 144, 255\")]\n    public Color Color\n    {\n        get => _color;\n        set\n        {\n            _color         = value;\n            _lightColor    = ControlPaint.Light(value, .4f);\n            _darkColor     = ControlPaint.Dark(_lightColor, .2f);\n            _darkDarkColor = ControlPaint.DarkDark(_lightColor);\n            Invalidate();\n        }\n    }\n    [DefaultValue(typeof(Color), \"180, 135, 206, 250\")]\n    public Color ReflectionColor\n    {\n        get => _centerreflectioncolor;\n        set\n        {\n            _centerreflectioncolor = value;\n            Invalidate();\n        }\n    }\n    [DefaultValue(typeof(bool), \"true\")]\n    public bool On\n    {\n        get => _on;\n        set\n        {\n            _on = value;\n            Invalidate();\n        }\n    }\n    [DefaultValue(typeof(bool), \"true\")]\n    public bool ReflectionOn\n    {\n        get => _reflectionon;\n        set\n        {\n            _reflectionon = value;\n            Invalidate();\n        }\n    }\n    protected override void OnPaint(PaintEventArgs e)\n    {\n        var offScreenBmp = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);\n        using (var g = Graphics.FromImage(offScreenBmp))\n        {\n            g.SmoothingMode = SmoothingMode.HighQuality;\n            DrawControl(g, On);\n            e.Graphics.DrawImageUnscaled(offScreenBmp, 0, 0);\n        }\n    }\n    private void DrawControl(Graphics g, bool on)\n    {\n        var lightColor = on ? _color : Color.FromArgb(180, _darkColor);\n        var darkColor  = on ? _darkColor : _darkDarkColor;\n        var width      = Width  - (Padding.Left + Padding.Right);\n        var height     = Height - (Padding.Top  + Padding.Bottom);\n        var diameter   = Math.Min(width, height);\n        diameter = Math.Max(diameter - 1, 1);\n        var rectangle = new Rectangle(Padding.Left, Padding.Top, diameter, diameter);\n        g.FillEllipse(new SolidBrush(darkColor), rectangle);\n        var path = new GraphicsPath();\n        path.AddEllipse(rectangle);\n        var pathBrush = new PathGradientBrush(path)\n        {\n            CenterColor    = lightColor,\n            SurroundColors = new[] {Color.FromArgb(0, lightColor)}\n        };\n        g.FillEllipse(pathBrush, rectangle);\n        if (_reflectionon)\n        {\n            var offset    = Convert.ToInt32(diameter        * .15F);\n            var diameter1 = Convert.ToInt32(rectangle.Width * .8F);\n            var whiteRect = new Rectangle(rectangle.X - offset, rectangle.Y - offset, diameter1, diameter1);\n            var path1     = new GraphicsPath();\n            path1.AddEllipse(whiteRect);\n            var pathBrush1 = new PathGradientBrush(path)\n            {\n                CenterColor    = _centerreflectioncolor,\n                SurroundColors = _surroundcolors\n            };\n            g.FillEllipse(pathBrush1, whiteRect);\n        }\n        g.SetClip(ClientRectangle);\n        if (On) g.DrawEllipse(new Pen(Color.FromArgb(85, Color.Black), 1F), rectangle);\n    }\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Ellipse Control<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[107,106],"_links":{"self":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/206"}],"collection":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/comments?post=206"}],"version-history":[{"count":1,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/206\/revisions"}],"predecessor-version":[{"id":207,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/posts\/206\/revisions\/207"}],"wp:attachment":[{"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/media?parent=206"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/categories?post=206"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/michaeljohnsteiner.com\/index.php\/wp-json\/wp\/v2\/tags?post=206"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}