source: 2014/24/EemeliK/Zombieland/ZombieLandLauncher/ZombieLandLauncher/XButton.cs @ 5907

Revision 5907, 17.8 KB checked in by taeekotr, 4 years ago (diff)
Line 
1using System;
2using System.ComponentModel;
3using System.Drawing;
4using System.Drawing.Drawing2D;
5using System.Windows.Forms;
6
7namespace ManiXButton
8{
9    public partial class XButton : Button
10    {
11        #region Fields
12
13        private ManiXButton.Theme thm = ManiXButton.Theme.MSOffice2010_BLUE;
14
15        private enum MouseState { None = 1, Down = 2, Up = 3, Enter = 4, Leave = 5, Move = 6 }
16
17        private MouseState MState = MouseState.None;
18
19        #endregion
20
21        #region Constructor
22
23        public XButton()
24        {
25            this.SetStyle(ControlStyles.SupportsTransparentBackColor |
26                      ControlStyles.Opaque |
27                      ControlStyles.ResizeRedraw |
28                      ControlStyles.OptimizedDoubleBuffer |
29                      ControlStyles.CacheText, // We gain about 2% in painting by avoiding extra GetWindowText calls
30                      true);
31
32            this.colorTable = new Colortable();
33
34            this.MouseLeave += new EventHandler(_MouseLeave);
35            this.MouseDown += new MouseEventHandler(_MouseDown);
36            this.MouseUp += new MouseEventHandler(_MouseUp);
37            this.MouseMove += new MouseEventHandler(_MouseMove);
38        }
39
40        #endregion
41
42        #region Events
43
44        #region Paint Transparent Background
45
46        protected void PaintTransparentBackground(Graphics g, Rectangle clipRect)
47        {
48            // check if we have a parent
49            if (this.Parent != null)
50            {
51                // convert the clipRects coordinates from ours to our parents
52                clipRect.Offset(this.Location);
53
54                PaintEventArgs e = new PaintEventArgs(g, clipRect);
55
56                // save the graphics state so that if anything goes wrong
57                // we're not fubar
58                GraphicsState state = g.Save();
59
60                try
61                {
62                    // move the graphics object so that we are drawing in
63                    // the correct place
64                    g.TranslateTransform((float)-this.Location.X, (float)-this.Location.Y);
65
66                    // draw the parents background and foreground
67                    this.InvokePaintBackground(this.Parent, e);
68                    this.InvokePaint(this.Parent, e);
69
70                    return;
71                }
72                finally
73                {
74                    // reset everything back to where they were before
75                    g.Restore(state);
76                    clipRect.Offset(-this.Location.X, -this.Location.Y);
77                }
78            }
79
80            // we don't have a parent, so fill the rect with
81            // the default control color
82            g.FillRectangle(SystemBrushes.Control, clipRect);
83        }
84
85        #endregion
86
87        #region Mouse Events
88
89        private void _MouseDown(object sender, MouseEventArgs mevent)
90        {
91            MState = MouseState.Down;
92            Invalidate();
93        }
94
95        private void _MouseUp(object sender, MouseEventArgs mevent)
96        {
97            MState = MouseState.Up;
98            Invalidate();
99        }
100
101        private void _MouseMove(object sender, MouseEventArgs mevent)
102        {
103            MState = MouseState.Move;
104            Invalidate();
105        }
106
107        private void _MouseLeave(object sender, EventArgs e)
108        {
109            MState = MouseState.Leave;
110            Invalidate();
111        }
112
113        #endregion
114
115        #region Path
116
117        public static GraphicsPath GetRoundedRect(RectangleF r, float radius)
118        {
119            GraphicsPath gp = new GraphicsPath();
120            gp.StartFigure();
121            r = new RectangleF(r.Left, r.Top, r.Width, r.Height);
122            if (radius <= 0.0F || radius <= 0.0F)
123            {
124                gp.AddRectangle(r);
125            }
126            else
127            {
128                gp.AddArc((float)r.X, (float)r.Y, radius, radius, 180, 90);
129                gp.AddArc((float)r.Right - radius, (float)r.Y, radius - 1, radius, 270, 90);
130                gp.AddArc((float)r.Right - radius, ((float)r.Bottom) - radius - 1, radius - 1, radius, 0, 90);
131                gp.AddArc((float)r.X, ((float)r.Bottom) - radius - 1, radius - 1, radius, 90, 90);
132            }
133            gp.CloseFigure();
134            return gp;
135        }
136
137        #endregion
138
139        protected override void OnPaint(PaintEventArgs e)
140        {
141            this.PaintTransparentBackground(e.Graphics, this.ClientRectangle);
142
143            #region Painting
144
145            //now let's we begin painting
146            Graphics g = e.Graphics;
147            g.SmoothingMode = SmoothingMode.HighQuality;
148            g.SmoothingMode = SmoothingMode.AntiAlias;
149            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
150
151            #endregion
152
153            #region Color
154
155            Color tTopColorBegin = this.colorTable.ButtonNormalColor1;
156            Color tTopColorEnd = this.colorTable.ButtonNormalColor2;
157            Color tBottomColorBegin = this.colorTable.ButtonNormalColor3;
158            Color tBottomColorEnd = this.colorTable.ButtonNormalColor4;
159            Color Textcol = this.colorTable.TextColor;
160
161
162            if (!this.Enabled)
163            {
164                tTopColorBegin = Color.FromArgb((int)(tTopColorBegin.GetBrightness() * 255),
165                    (int)(tTopColorBegin.GetBrightness() * 255),
166                    (int)(tTopColorBegin.GetBrightness() * 255));
167                tBottomColorEnd = Color.FromArgb((int)(tBottomColorEnd.GetBrightness() * 255),
168                    (int)(tBottomColorEnd.GetBrightness() * 255),
169                    (int)(tBottomColorEnd.GetBrightness() * 255));
170            }
171            else
172            {
173                if (MState == MouseState.None || MState == MouseState.Leave)
174                {
175                    tTopColorBegin = this.colorTable.ButtonNormalColor1;
176                    tTopColorEnd = this.colorTable.ButtonNormalColor2;
177                    tBottomColorBegin = this.colorTable.ButtonNormalColor3;
178                    tBottomColorEnd = this.colorTable.ButtonNormalColor4;
179                    Textcol = this.colorTable.TextColor;
180                }
181                else if (MState == MouseState.Down)
182                {
183                    tTopColorBegin = this.colorTable.ButtonSelectedColor1;
184                    tTopColorEnd = this.colorTable.ButtonSelectedColor2;
185                    tBottomColorBegin = this.colorTable.ButtonSelectedColor3;
186                    tBottomColorEnd = this.colorTable.ButtonSelectedColor4;
187                    Textcol = this.colorTable.SelectedTextColor;
188                }
189                else if (MState == MouseState.Move || MState == MouseState.Up)
190                {
191                    tTopColorBegin = this.colorTable.ButtonMouseOverColor1;
192                    tTopColorEnd = this.colorTable.ButtonMouseOverColor2;
193                    tBottomColorBegin = this.colorTable.ButtonMouseOverColor3;
194                    tBottomColorEnd = this.colorTable.ButtonMouseOverColor4;
195                    Textcol = this.colorTable.HoverTextColor;
196                }
197            }
198
199
200            #endregion
201
202            #region Theme 2010
203
204            if (thm == ManiXButton.Theme.MSOffice2010_BLUE || thm == ManiXButton.Theme.MSOffice2010_Green || thm == ManiXButton.Theme.MSOffice2010_Yellow || thm == ManiXButton.Theme.MSOffice2010_Publisher ||
205                thm == ManiXButton.Theme.MSOffice2010_RED || thm == ManiXButton.Theme.MSOffice2010_WHITE || thm == ManiXButton.Theme.MSOffice2010_Pink)
206            {
207                Paint2010Background(e, g, tTopColorBegin, tTopColorEnd, tBottomColorBegin, tBottomColorEnd);
208                TEXTandIMAGE(this.ClientRectangle, g, Textcol);
209            }
210
211            #endregion
212        }
213
214        #region Paint 2010 Background
215
216        protected void Paint2010Background(PaintEventArgs e, Graphics g, Color tTopColorBegin, Color tTopColorEnd, Color tBottomColorBegin, Color tBottomColorEnd)
217        {
218            int _roundedRadiusX = 6;
219
220            Rectangle r = new Rectangle(this.ClientRectangle.Left, this.ClientRectangle.Top, this.ClientRectangle.Width, this.ClientRectangle.Height);
221            Rectangle j = r;
222            Rectangle r2 = r;
223            r2.Inflate(-1, -1);
224            Rectangle r3 = r2;
225            r3.Inflate(-1, -1);
226
227            //rectangle for gradient, half upper and lower
228            RectangleF halfup = new RectangleF(r.Left, r.Top, r.Width, r.Height);
229            RectangleF halfdown = new RectangleF(r.Left, r.Top + (r.Height / 2) - 1, r.Width, r.Height);
230
231            //BEGIN PAINT BACKGROUND
232            //for half upper, we paint using linear gradient
233            using (GraphicsPath thePath = GetRoundedRect(r, _roundedRadiusX))
234            {
235                LinearGradientBrush lgb = new LinearGradientBrush(halfup, tBottomColorEnd, tBottomColorBegin, 90f, true);
236
237                Blend blend = new Blend(4);
238                blend.Positions = new float[] { 0, 0.18f, 0.35f, 1f };
239                blend.Factors = new float[] { 0f, .4f, .9f, 1f };
240                lgb.Blend = blend;
241                g.FillPath(lgb, thePath);
242                lgb.Dispose();
243
244                //for half lower, we paint using radial gradient
245                using (GraphicsPath p = new GraphicsPath())
246                {
247                    p.AddEllipse(halfdown); //make it radial
248                    using (PathGradientBrush gradient = new PathGradientBrush(p))
249                    {
250                        gradient.WrapMode = WrapMode.Clamp;
251                        gradient.CenterPoint = new PointF(Convert.ToSingle(halfdown.Left + halfdown.Width / 2), Convert.ToSingle(halfdown.Bottom));
252                        gradient.CenterColor = tBottomColorEnd;
253                        gradient.SurroundColors = new Color[] { tBottomColorBegin };
254
255                        blend = new Blend(4);
256                        blend.Positions = new float[] { 0, 0.15f, 0.4f, 1f };
257                        blend.Factors = new float[] { 0f, .3f, 1f, 1f };
258                        gradient.Blend = blend;
259
260                        g.FillPath(gradient, thePath);
261                    }
262                }
263                //END PAINT BACKGROUND
264
265                //BEGIN PAINT BORDERS
266                using (GraphicsPath gborderDark = thePath)
267                {
268                    using (Pen p = new Pen(tTopColorBegin, 1))
269                    {
270                        g.DrawPath(p, gborderDark);
271                    }
272                }
273                using (GraphicsPath gborderLight = GetRoundedRect(r2, _roundedRadiusX))
274                {
275                    using (Pen p = new Pen(tTopColorEnd, 1))
276                    {
277                        g.DrawPath(p, gborderLight);
278                    }
279                }
280                using (GraphicsPath gborderMed = GetRoundedRect(r3, _roundedRadiusX))
281                {
282                    SolidBrush bordermed = new SolidBrush(Color.FromArgb(50, tTopColorEnd));
283                    using (Pen p = new Pen(bordermed, 1))
284                    {
285                        g.DrawPath(p, gborderMed);
286                    }
287                }
288                //END PAINT BORDERS
289            }
290        }
291
292        #endregion
293
294        #region Paint TEXT AND IMAGE
295
296        protected void TEXTandIMAGE(Rectangle Rec, Graphics g, Color textColor)
297        {
298            //BEGIN PAINT TEXT
299            StringFormat sf = new StringFormat();
300            sf.Alignment = StringAlignment.Center;
301            sf.LineAlignment = StringAlignment.Center;
302
303            #region Top
304
305            if (this.TextAlign == ContentAlignment.TopLeft)
306            {
307                sf.LineAlignment = StringAlignment.Near;
308                sf.Alignment = StringAlignment.Near;
309            }
310            else if (this.TextAlign == ContentAlignment.TopCenter)
311            {
312                sf.LineAlignment = StringAlignment.Near;
313                sf.Alignment = StringAlignment.Center;
314            }
315            else if (this.TextAlign == ContentAlignment.TopRight)
316            {
317                sf.LineAlignment = StringAlignment.Near;
318                sf.Alignment = StringAlignment.Far;
319            }
320
321            #endregion
322
323            #region Middle
324
325            else if (this.TextAlign == ContentAlignment.MiddleLeft)
326            {
327                sf.LineAlignment = StringAlignment.Center;
328                sf.Alignment = StringAlignment.Near;
329            }
330            else if (this.TextAlign == ContentAlignment.MiddleCenter)
331            {
332                sf.LineAlignment = StringAlignment.Center;
333                sf.Alignment = StringAlignment.Center;
334            }
335            else if (this.TextAlign == ContentAlignment.MiddleRight)
336            {
337                sf.LineAlignment = StringAlignment.Center;
338                sf.Alignment = StringAlignment.Far;
339            }
340
341            #endregion
342
343            #region Bottom
344
345            else if (this.TextAlign == ContentAlignment.BottomLeft)
346            {
347                sf.LineAlignment = StringAlignment.Far;
348                sf.Alignment = StringAlignment.Near;
349            }
350            else if (this.TextAlign == ContentAlignment.BottomCenter)
351            {
352                sf.LineAlignment = StringAlignment.Far;
353                sf.Alignment = StringAlignment.Center;
354            }
355            else if (this.TextAlign == ContentAlignment.BottomRight)
356            {
357                sf.LineAlignment = StringAlignment.Far;
358                sf.Alignment = StringAlignment.Far;
359            }
360
361            #endregion
362
363            if (this.ShowKeyboardCues)
364                sf.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.Show;
365            else
366                sf.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.Hide;
367            g.DrawString(this.Text, this.Font, new SolidBrush(textColor), Rec, sf);
368        }
369
370        #endregion
371
372        #endregion
373
374        #region Properties
375
376        #region ColorTable
377
378        Colortable colorTable = null;
379
380        [DefaultValue(typeof(Colortable), "Office2010Blue")]
381        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
382        public Colortable ColorTable
383        {
384            get
385            {
386                if (colorTable == null)
387                    colorTable = new Colortable();
388
389                return colorTable;
390            }
391            set
392            {
393
394                if (value == null)
395                    value = Colortable.Office2010Blue;
396
397                colorTable = (Colortable)value;
398
399                this.Invalidate();
400
401            }
402        }
403
404        public ManiXButton.Theme Theme
405        {
406            get
407            {
408                if (this.colorTable == Colortable.Office2010Green)
409                {
410                    return ManiXButton.Theme.MSOffice2010_Green;
411                }
412                else if (this.colorTable == Colortable.Office2010Red)
413                {
414                    return ManiXButton.Theme.MSOffice2010_RED;
415                }
416                else if (this.colorTable == Colortable.Office2010Pink)
417                {
418                    return ManiXButton.Theme.MSOffice2010_Pink;
419                }
420                else if (this.colorTable == Colortable.Office2010Yellow)
421                {
422                    return ManiXButton.Theme.MSOffice2010_Yellow;
423                }
424                else if (this.colorTable == Colortable.Office2010White)
425                {
426                    return ManiXButton.Theme.MSOffice2010_WHITE;
427                }
428                else if (this.colorTable == Colortable.Office2010Publisher)
429                {
430                    return ManiXButton.Theme.MSOffice2010_Publisher;
431                }
432
433                return ManiXButton.Theme.MSOffice2010_BLUE;
434            }
435
436            set
437            {
438                this.thm = value;
439
440                if (thm == ManiXButton.Theme.MSOffice2010_Green)
441                {
442                    this.colorTable = Colortable.Office2010Green;
443                }
444                else if (thm == ManiXButton.Theme.MSOffice2010_RED)
445                {
446                    this.colorTable = Colortable.Office2010Red;
447                }
448                else if (thm == ManiXButton.Theme.MSOffice2010_Pink)
449                {
450                    this.colorTable = Colortable.Office2010Pink;
451                }
452                else if (thm == ManiXButton.Theme.MSOffice2010_WHITE)
453                {
454                    this.colorTable = Colortable.Office2010White;
455                }
456                else if (thm == ManiXButton.Theme.MSOffice2010_Yellow)
457                {
458                    this.colorTable = Colortable.Office2010Yellow;
459                }
460                else if (thm == ManiXButton.Theme.MSOffice2010_Publisher)
461                {
462                    this.colorTable = Colortable.Office2010Publisher;
463                }
464                else
465                {
466                    this.colorTable = Colortable.Office2010Blue;
467                }
468            }
469        }
470
471        #endregion
472
473        #region Background Image
474
475        [Browsable(false)]
476        public override Image BackgroundImage
477        {
478            get
479            {
480                return base.BackgroundImage;
481            }
482            set
483            {
484                base.BackgroundImage = value;
485            }
486        }
487
488        [Browsable(false)]
489        public override ImageLayout BackgroundImageLayout
490        {
491            get
492            {
493                return base.BackgroundImageLayout;
494            }
495            set
496            {
497                base.BackgroundImageLayout = value;
498            }
499        }
500
501        #endregion
502
503        #endregion
504    }
505}
Note: See TracBrowser for help on using the repository browser.