4 * This software is distributed under a BSD-style license.
\r
5 * See license.txt for more information.
\r
9 using System.Collections.Generic;
\r
10 using System.ComponentModel;
\r
11 using System.Drawing;
\r
14 using System.Windows.Forms;
\r
15 using System.Drawing.Drawing2D;
\r
19 public partial class BitSwitch : UserControl
\r
23 private bool isExponential;
\r
24 private static Bitmap normal;
\r
25 private static Bitmap exponent;
\r
26 private static Bitmap hover;
\r
32 InitializeComponent();
\r
34 if (BorderColor.IsEmpty)
\r
36 BorderColor = Color.FromArgb(0xD5, 0xDF, 0xE5);
\r
38 UpdateBackgroundImage();
\r
44 [Category("Behavior")]
\r
45 public event System.EventHandler StateChanged;
\r
49 [DefaultValue(typeof(bool), "True")]
\r
52 get { return state; }
\r
55 SetStateWithoutEvent(value);
\r
56 if (StateChanged != null)
\r
58 StateChanged(this, new EventArgs());
\r
63 [Category("Appearance")]
\r
64 [DefaultValue(typeof(Color), "LightSteelBlue")]
\r
65 public Color BorderColor
\r
71 [CategoryAttribute("Data")]
\r
72 [DefaultValue(typeof(bool), "False")]
\r
73 public bool IsExponential
\r
77 return isExponential;
\r
81 isExponential = value;
\r
82 UpdateBackgroundImage();
\r
88 #region event handlers
\r
89 private void label_Click(object sender, EventArgs e)
\r
95 private void label_MouseLeave(object sender, EventArgs e)
\r
97 BackgroundImage = IsExponential ? exponent : normal;
\r
101 private void label_MouseEnter(object sender, EventArgs e)
\r
103 BackgroundImage = hover;
\r
107 private void label_Paint(object sender, PaintEventArgs e)
\r
111 e.Graphics.FillRectangle(
\r
112 Brushes.LightGray, 0, 0, Width, Height);
\r
114 using (Pen p = new Pen(BorderColor, 1))
\r
116 int width = Tag != null ? Width - 1 : Width;
\r
117 e.Graphics.DrawRectangle(p, 0, 0, width, Height - 1);
\r
121 private void BitSwitch_SizeChanged(object sender, EventArgs e)
\r
123 if (Width <= MinimumSize.Width || Height <= MinimumSize.Height)
\r
127 UpdateBackgroundImage();
\r
132 #region private methods
\r
134 private void CreateNormalBackgroundImage()
\r
136 if (normal is Bitmap && normal.Size == Size)
\r
140 normal = CreateBackGroundImage(Color.White, Color.Lavender,
\r
141 Color.Gainsboro, Color.Lavender);
\r
144 private void CreateHoverBackgroundImage()
\r
146 if (hover is Bitmap && hover.Size == Size)
\r
150 hover = CreateBackGroundImage(Color.LemonChiffon, Color.Gold,
\r
151 Color.Orange, Color.DarkOrange);
\r
154 private void CreateExponentBackgroundImage()
\r
156 if (exponent is Bitmap && exponent.Size == Size)
\r
160 exponent = CreateBackGroundImage(Color.LemonChiffon, Color.Bisque,
\r
161 Color.NavajoWhite, Color.Bisque);
\r
164 private Bitmap CreateBackGroundImage(
\r
165 Color hilight, Color light, Color face, Color dark)
\r
167 if (Width < MinimumSize.Width || Height < MinimumSize.Height)
\r
171 Bitmap bmp = new Bitmap(Width, Height);
\r
172 Graphics g = Graphics.FromImage(bmp);
\r
173 int border = (int)(Height * 0.48);
\r
174 Rectangle upper = new Rectangle(0, 0, Width, border);
\r
175 Rectangle lower = new Rectangle(0, border, Width, Height);
\r
176 LinearGradientBrush brushL =
\r
177 new LinearGradientBrush(upper, hilight, light,
\r
178 LinearGradientMode.Vertical);
\r
179 LinearGradientBrush brushD =
\r
180 new LinearGradientBrush(lower, face, dark,
\r
181 LinearGradientMode.Vertical);
\r
182 Pen edge = new Pen(hilight, 1);
\r
183 g.FillRectangle(brushL, upper);
\r
184 g.FillRectangle(brushD, lower);
\r
185 g.DrawRectangle(edge, 1, 1, Width - 1, Height - 3);
\r
193 public void SetStateWithoutEvent(bool state)
\r
195 this.state = state;
\r
196 label.Text = state ? "1" : "0";
\r
197 label.ForeColor = state ? Color.DarkSlateGray : Color.SteelBlue;
\r
198 label.Font = new Font(label.Font,
\r
199 state ? FontStyle.Bold : FontStyle.Regular);
\r
202 private void UpdateBackgroundImage()
\r
204 bool mouseOver = BackgroundImage == hover;
\r
205 CreateNormalBackgroundImage();
\r
206 CreateHoverBackgroundImage();
\r
207 CreateExponentBackgroundImage();
\r
210 BackgroundImage = IsExponential ? exponent : normal;
\r
214 BackgroundImage = hover;
\r