|
can any one convert it to vb.net, i do but have some conversion bugs that could not be resolved.
|
|
|
|
|
Very good project. You've got my 5
|
|
|
|
|
Thanks a lot (a long time ago...), if one of these days I make money by my own, I will create the Office Modern UI for touch, meanwhile I setting ready my W8 apps.
|
|
|
|
|
Two BUGS
1:Exception if Radius is less than 2
2:TextAlign not work
here is the right code
public class RibbonMenuButton : Button
{
#region About Constructor
public RibbonMenuButton()
{
this.SetStyle(ControlStyles.SupportsTransparentBackColor |
ControlStyles.UserPaint |
ControlStyles.ResizeRedraw |
ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.Opaque, false);
this.FlatAppearance.BorderSize = 0;
this.FlatStyle = FlatStyle.Flat;
this.BackColor = Color.Transparent;
timer1.Interval = 5;
timer1.Tick += new EventHandler(timer1_Tick);
}
protected override void OnCreateControl()
{
base.OnCreateControl();
A0 = ColorBase.A;
R0 = ColorBase.R;
G0 = ColorBase.G;
B0 = ColorBase.B;
_colorStroke = _baseStroke;
Rectangle r = new Rectangle(new Point(-1, -1), new Size(this.Width + _radius, this.Height + _radius));
#region Transform to SmoothRectangle Region
if (this.Size != null)
{
GraphicsPath pathregion = new GraphicsPath();
DrawArc(r, pathregion);
this.Region = new Region(pathregion);
}
#endregion
}
#endregion
#region About Image Settings
private e_imagelocation _imagelocation;
public enum e_imagelocation
{
Top, Bottom, Left, Right, None
}
public e_imagelocation ImageLocation
{
get { return _imagelocation; }
set { _imagelocation = value; this.Refresh(); }
}
private int _imageoffset;
public int ImageOffset
{
get { return _imageoffset; }
set { _imageoffset = value; }
}
private Point _maximagesize;
public Point MaxImageSize
{
get { return _maximagesize; }
set { _maximagesize = value; }
}
#endregion
#region About Button Settings
private e_showbase _showbase;
private e_showbase _tempshowbase;
public enum e_showbase
{
Yes, No
}
public e_showbase ShowBase
{
get { return _showbase; }
set { _showbase = value; this.Refresh(); }
}
private int _radius = 6;
public int Radius
{
get { return _radius; }
set
{
if (value > 0)
{
_radius = value;
}else{
_radius = 2;
}
this.Refresh();
}
}
private e_groupPos _grouppos;
public enum e_groupPos
{
None, Left, Center, Right, Top, Bottom
}
public e_groupPos GroupPos
{
get { return _grouppos; }
set { _grouppos = value; this.Refresh(); }
}
private e_arrow _arrow;
public enum e_arrow
{
None, ToRight, ToDown
}
public e_arrow Arrow
{
get { return _arrow; }
set { _arrow = value; this.Refresh(); }
}
private e_splitbutton _splitbutton;
public enum e_splitbutton
{
No, Yes
}
public e_splitbutton SplitButton
{
get { return _splitbutton; }
set { _splitbutton = value; this.Refresh(); }
}
private int _splitdistance = 0;
public int SplitDistance
{
get { return _splitdistance; }
set { _splitdistance = value; this.Refresh(); }
}
private string _title = "";
public string Title
{
get { return _title; }
set { _title = value; this.Refresh(); }
}
private bool _keeppress = false;
public bool KeepPress
{
get { return _keeppress; }
set { _keeppress = value; }
}
private bool _ispressed = false;
public bool IsPressed
{
get { return _ispressed; }
set { _ispressed = value; }
}
#endregion
#region Menu Pos
private Point _menupos = new Point(0, 0);
public Point MenuPos
{
get { return _menupos; }
set { _menupos = value; }
}
#endregion
#region Colors
private Color _baseColor = Color.FromArgb(186, 209, 240);
private Color _onColor = Color.FromArgb(255, 214, 78);
private Color _pressColor = Color.FromArgb(255, 128, 0);
private Color _baseStroke = Color.FromArgb(152, 187, 213);
private Color _onStroke = Color.FromArgb(196, 177, 118);
private Color _pressStroke = Color.FromArgb(128, 64, 0);
private Color _colorStroke = Color.FromArgb(255, 255, 255);
private int A0, R0, G0, B0;
public Color ColorBase
{
get { return _baseColor; }
set
{
_baseColor = value;
R0 = _baseColor.R;
B0 = _baseColor.B;
G0 = _baseColor.G;
A0 = _baseColor.A;
RibbonColor hsb = new RibbonColor(_baseColor);
if (hsb.BC < 50)
{
hsb.SetBrightness(60);
}
else
{
hsb.SetBrightness(30);
}
if (_baseColor.A > 0)
_baseStroke = Color.FromArgb(100, hsb.GetColor());
else
_baseStroke = Color.FromArgb(0, hsb.GetColor());
this.Refresh();
}
}
public Color ColorOn
{
get { return _onColor; }
set
{
_onColor = value;
RibbonColor hsb = new RibbonColor(_onColor);
if (hsb.BC < 50)
{
hsb.SetBrightness(60);
}
else
{
hsb.SetBrightness(30);
}
if (_baseStroke.A > 0)
_onStroke = Color.FromArgb(100, hsb.GetColor());
else
_onStroke = Color.FromArgb(0, hsb.GetColor());
this.Refresh();
}
}
public Color ColorPress
{
get { return _pressColor; }
set
{
_pressColor = value;
RibbonColor hsb = new RibbonColor(_pressColor);
if (hsb.BC < 50)
{
hsb.SetBrightness(60);
}
else
{
hsb.SetBrightness(30);
}
if (_baseStroke.A > 0)
_pressStroke = Color.FromArgb(100, hsb.GetColor());
else
_pressStroke = Color.FromArgb(0, hsb.GetColor());
this.Refresh();
}
}
public Color ColorBaseStroke
{
get { return _baseStroke; }
set { _baseStroke = value; }
}
public Color ColorOnStroke
{
get { return _onStroke; }
set { _onStroke = value; }
}
public Color ColorPressStroke
{
get { return _pressStroke; }
set { _pressStroke = value; }
}
public Color GetColorIncreased(Color color, int h, int s, int b)
{
RibbonColor _color = new RibbonColor(color);
int ss = _color.GetSaturation();
float vc = b + _color.GetBrightness();
float hc = h + _color.GetHue();
float sc = s + ss;
_color.VC = vc;
_color.HC = hc;
_color.SC = sc;
return _color.GetColor();
}
public Color GetColor(int A, int R, int G, int B)
{
if (A + A0 > 255) { A = 255; } else { A = A + A0; }
if (R + R0 > 255) { R = 255; } else { R = R + R0; }
if (G + G0 > 255) { G = 255; } else { G = G + G0; }
if (B + B0 > 255) { B = 255; } else { B = B + B0; }
return Color.FromArgb(A, R, G, B);
}
#endregion
protected override void OnPaint(PaintEventArgs pevent)
{
#region Variables & Conf
Graphics g = pevent.Graphics;
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.High;
Rectangle r = new Rectangle(new Point(-1, -1), new Size(this.Width + _radius, this.Height + _radius));
#endregion
#region Paint
GraphicsPath path = new GraphicsPath();
Rectangle rp = new Rectangle(new Point(0, 0), new Size(this.Width - 1, this.Height - 1));
DrawArc(rp, path);
FillGradients(g, path);
DrawImage(g);
DrawString(g);
DrawArrow(g);
#endregion
}
protected override void OnResize(EventArgs e)
{
Rectangle r = new Rectangle(new Point(-1, -1), new Size(this.Width + _radius, this.Height + _radius));
if (this.Size != null)
{
GraphicsPath pathregion = new GraphicsPath();
DrawArc(r, pathregion);
this.Region = new Region(pathregion);
}
base.OnResize(e);
}
#region Paint Methods
public void FillGradients(Graphics gr, GraphicsPath pa)
{
int origin = this.Height / 3; int end = this.Height; int oe = (end - origin) / 2;
LinearGradientBrush lgbrush; Rectangle rect;
if (_showbase == e_showbase.Yes)
{
rect = new Rectangle(new Point(0, 0), new Size(this.Width - 1, this.Height - 1));
pa = new GraphicsPath();
DrawArc(rect, pa);
lgbrush = new LinearGradientBrush(rect, Color.Transparent, Color.Transparent, LinearGradientMode.Vertical);
#region Main Gradient
float[] pos = new float[4];
pos[0] = 0.0F; pos[1] = 0.3F; pos[2] = 0.35F; pos[3] = 1.0F;
Color[] colors = new Color[4];
if (i_mode == 0)
{
colors[0] = GetColor(0, 35, 24, 9);
colors[1] = GetColor(0, 13, 8, 3);
colors[2] = Color.FromArgb(A0, R0, G0, B0);
colors[3] = GetColor(0, 28, 29, 14);
}
else
{
colors[0] = GetColor(0, 0, 50, 100);
colors[1] = GetColor(0, 0, 0, 30);
colors[2] = Color.FromArgb(A0, R0, G0, B0);
colors[3] = GetColor(0, 0, 50, 100);
}
ColorBlend mix = new ColorBlend();
mix.Colors = colors;
mix.Positions = pos;
lgbrush.InterpolationColors = mix;
gr.FillPath(lgbrush, pa);
#endregion
#region Fill Band
rect = new Rectangle(new Point(0, 0), new Size(this.Width, this.Height / 3));
pa = new GraphicsPath(); int _rtemp = _radius; _radius = _rtemp - 1;
DrawArc(rect, pa);
if (A0 > 80)
{
gr.FillPath(new SolidBrush(Color.FromArgb(60, 255, 255, 255)), pa);
}
_radius = _rtemp;
#endregion
#region SplitFill
if (_splitbutton == e_splitbutton.Yes & mouse)
{
FillSplit(gr);
}
#endregion
#region Shadow
if (i_mode == 2)
{
rect = new Rectangle(1, 1, this.Width - 2, this.Height);
pa = new GraphicsPath();
DrawShadow(rect, pa);
gr.DrawPath(new Pen(Color.FromArgb(50, 20, 20, 20), 2.0F), pa);
}
else
{
rect = new Rectangle(1, 1, this.Width - 2, this.Height - 1);
pa = new GraphicsPath();
DrawShadow(rect, pa);
if (A0 > 80)
{
gr.DrawPath(new Pen(Color.FromArgb(100, 250, 250, 250), 3.0F), pa);
}
}
#endregion
#region SplitLine
if (_splitbutton == e_splitbutton.Yes)
{
if (_imagelocation == e_imagelocation.Top)
{
switch (i_mode)
{
case 1:
gr.DrawLine(new Pen(_onStroke), new Point(1, this.Height - _splitdistance), new Point(this.Width - 1, this.Height - _splitdistance));
break;
case 2:
gr.DrawLine(new Pen(_pressStroke), new Point(1, this.Height - _splitdistance), new Point(this.Width - 1, this.Height - _splitdistance));
break;
default:
break;
}
}
else if (_imagelocation == e_imagelocation.Left)
{
switch (i_mode)
{
case 1:
gr.DrawLine(new Pen(_onStroke), new Point(this.Width - _splitdistance, 0), new Point(this.Width - _splitdistance, this.Height));
break;
case 2:
gr.DrawLine(new Pen(_pressStroke), new Point(this.Width - _splitdistance, 0), new Point(this.Width - _splitdistance, this.Height));
break;
default:
break;
}
}
}
#endregion
rect = new Rectangle(new Point(0, 0), new Size(this.Width - 1, this.Height - 1));
pa = new GraphicsPath();
DrawArc(rect, pa);
gr.DrawPath(new Pen(_colorStroke, 0.9F), pa);
pa.Dispose(); lgbrush.Dispose();
}
}
int offsetx = 0, offsety = 0, imageheight = 0, imagewidth = 0;
public void DrawImage(Graphics gr)
{
if (this.Image != null)
{
offsety = _imageoffset; offsetx = _imageoffset;
if (_imagelocation == e_imagelocation.Left | _imagelocation == e_imagelocation.Right)
{
imageheight = this.Height - offsety * 2;
if (imageheight > _maximagesize.Y & _maximagesize.Y != 0)
{ imageheight = _maximagesize.Y; }
imagewidth = (int)((Convert.ToDouble(imageheight) / this.Image.Height) * this.Image.Width);
}
else if (_imagelocation == e_imagelocation.Top | _imagelocation == e_imagelocation.Bottom)
{
imagewidth = this.Width - offsetx * 2;
if (imagewidth > _maximagesize.X & _maximagesize.X != 0)
{ imagewidth = _maximagesize.X; }
imageheight = (int)((Convert.ToDouble(imagewidth) / this.Image.Width) * this.Image.Height);
}
switch (_imagelocation)
{
case e_imagelocation.Left:
gr.DrawImage(this.Image, new Rectangle(offsetx, offsety, imagewidth, imageheight));
break;
case e_imagelocation.Right:
gr.DrawImage(this.Image, new Rectangle(this.Width - imagewidth - offsetx, offsety, imagewidth, imageheight));
break;
case e_imagelocation.Top:
offsetx = this.Width / 2 - imagewidth / 2;
gr.DrawImage(this.Image, new Rectangle(offsetx, offsety, imagewidth, imageheight));
break;
case e_imagelocation.Bottom:
gr.DrawImage(this.Image, new Rectangle(offsetx, this.Height - imageheight - offsety, imagewidth, imageheight));
break;
default:
break;
}
}
}
public void DrawString(Graphics gr)
{
if (this.Text != "")
{
int textwidth = (int)gr.MeasureString(this.Text, this.Font).Width;
int textheight = (int)gr.MeasureString(this.Text, this.Font).Height;
int extraoffset = 0;
Font fontb = new Font(this.Font, FontStyle.Bold);
if (_title != "")
{
extraoffset = textheight / 2;
}
string s1 = this.Text; string s2 = "";
int jump = this.Text.IndexOf("\\n");
if (jump != -1)
{
s2 = s1.Substring(jump + 3); s1 = s1.Substring(0, jump);
}
#region Calc Color Brightness
RibbonColor __color = new RibbonColor(Color.FromArgb(R0, G0, B0));
RibbonColor forecolor = new RibbonColor(this.ForeColor);
Color _forecolor;
if (__color.GetBrightness() > 50)
{
forecolor.BC = 1;
forecolor.SC = 80;
}
else
{
forecolor.BC = 99;
forecolor.SC = 20;
}
_forecolor = forecolor.GetColor();
#endregion
if (this.Image == null)
{
switch (this.TextAlign)
{
case ContentAlignment.BottomCenter:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(this.Width / 2 - textwidth / 2 - 1, this.Height - textheight - 1));
break;
case ContentAlignment.BottomLeft:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(1, this.Height - textheight - 1));
break;
case ContentAlignment.BottomRight:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(this.Width - textwidth - 1, this.Height - textheight - 1));
break;
case ContentAlignment.MiddleCenter:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(this.Width / 2 - textwidth / 2 - 1, this.Height / 2 - textheight / 2 - 1));
break;
case ContentAlignment.MiddleLeft:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(1, this.Height / 2 - textheight / 2 - 1));
break;
case ContentAlignment.MiddleRight:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(this.Width - textwidth - 1, this.Height / 2 - textheight / 2 - 1));
break;
case ContentAlignment.TopCenter:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(this.Width / 2 - textwidth / 2 - 1, 1));
break;
case ContentAlignment.TopLeft:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(1, 1));
break;
case ContentAlignment.TopRight:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(this.Width - textwidth - 1, 1));
break;
default:
break;
}
}else{
switch (_imagelocation)
{
case e_imagelocation.Left:
if (this.Title != "")
{
gr.DrawString(this.Title, fontb, new SolidBrush(_forecolor), new PointF(offsetx + imagewidth + 4, this.Font.Size / 2));
gr.DrawString(s1, this.Font, new SolidBrush(_forecolor), new PointF(offsetx + imagewidth + 4, 2 * this.Font.Size + 1));
gr.DrawString(s2, this.Font, new SolidBrush(_forecolor), new PointF(offsetx + imagewidth + 4, 3 * this.Font.Size + 4));
}
else
{
gr.DrawString(s1, this.Font, new SolidBrush(_forecolor), new PointF(offsetx + imagewidth + 4, this.Height / 2 - this.Font.Size + 1));
}
break;
case e_imagelocation.Right:
gr.DrawString(this.Title, fontb, new SolidBrush(_forecolor), new PointF(offsetx, this.Height / 2 - this.Font.Size + 1 - extraoffset));
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(offsetx, extraoffset + this.Height / 2 - this.Font.Size + 1));
break;
case e_imagelocation.Top:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(this.Width / 2 - textwidth / 2 - 1, offsety + imageheight));
break;
case e_imagelocation.Bottom:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(this.Width / 2 - textwidth / 2 - 1, this.Height - imageheight - textheight - 1));
break;
case e_imagelocation.None:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(this.Width / 2 - textwidth / 2 - 1, this.Height / 2 - textheight / 2 - 1));
break;
default:
break;
}
}
fontb.Dispose();
}
}
public void DrawArc(Rectangle re, GraphicsPath pa)
{
int _radiusX0Y0 = _radius, _radiusXFY0 = _radius, _radiusX0YF = _radius, _radiusXFYF = _radius;
switch (_grouppos)
{
case e_groupPos.Left:
_radiusXFY0 = 1; _radiusXFYF = 1;
break;
case e_groupPos.Center:
_radiusX0Y0 = 1; _radiusX0YF = 1; _radiusXFY0 = 1; _radiusXFYF = 1;
break;
case e_groupPos.Right:
_radiusX0Y0 = 1; _radiusX0YF = 1;
break;
case e_groupPos.Top:
_radiusX0YF = 1; _radiusXFYF = 1;
break;
case e_groupPos.Bottom:
_radiusX0Y0 = 1; _radiusXFY0 = 1;
break;
}
pa.AddArc(re.X, re.Y, _radiusX0Y0, _radiusX0Y0, 180, 90);
pa.AddArc(re.Width - _radiusXFY0, re.Y, _radiusXFY0, _radiusXFY0, 270, 90);
pa.AddArc(re.Width - _radiusXFYF, re.Height - _radiusXFYF, _radiusXFYF, _radiusXFYF, 0, 90);
pa.AddArc(re.X, re.Height - _radiusX0YF, _radiusX0YF, _radiusX0YF, 90, 90);
pa.CloseFigure();
}
public void DrawShadow(Rectangle re, GraphicsPath pa)
{
int _radiusX0Y0 = _radius, _radiusXFY0 = _radius, _radiusX0YF = _radius, _radiusXFYF = _radius;
switch (_grouppos)
{
case e_groupPos.Left:
_radiusXFY0 = 1; _radiusXFYF = 1;
break;
case e_groupPos.Center:
_radiusX0Y0 = 1; _radiusX0YF = 1; _radiusXFY0 = 1; _radiusXFYF = 1;
break;
case e_groupPos.Right:
_radiusX0Y0 = 1; _radiusX0YF = 1;
break;
case e_groupPos.Top:
_radiusX0YF = 1; _radiusXFYF = 1;
break;
case e_groupPos.Bottom:
_radiusX0Y0 = 1; _radiusXFY0 = 1;
break;
}
pa.AddArc(re.X, re.Y, _radiusX0Y0, _radiusX0Y0, 180, 90);
pa.AddArc(re.Width - _radiusXFY0, re.Y, _radiusXFY0, _radiusXFY0, 270, 90);
pa.AddArc(re.Width - _radiusXFYF, re.Height - _radiusXFYF, _radiusXFYF, _radiusXFYF, 0, 90);
pa.AddArc(re.X, re.Height - _radiusX0YF, _radiusX0YF, _radiusX0YF, 90, 90);
pa.CloseFigure();
}
public void DrawArrow(Graphics gr)
{
int _size = 1;
RibbonColor __color = new RibbonColor(Color.FromArgb(R0, G0, B0));
RibbonColor forecolor = new RibbonColor(this.ForeColor);
Color _forecolor;
if (__color.GetBrightness() > 50)
{
forecolor.BC = 1;
forecolor.SC = 80;
}
else
{
forecolor.BC = 99;
forecolor.SC = 20;
}
_forecolor = forecolor.GetColor();
switch (_arrow)
{
case e_arrow.ToDown:
if (_imagelocation == e_imagelocation.Left)
{
Point[] points = new Point[3];
points[0] = new Point(this.Width - 8 * _size - _imageoffset, this.Height / 2 - _size / 2);
points[1] = new Point(this.Width - 2 * _size - _imageoffset, this.Height / 2 - _size / 2);
points[2] = new Point(this.Width - 5 * _size - _imageoffset, this.Height / 2 + _size * 2);
gr.FillPolygon(new SolidBrush(_forecolor), points);
}
else if (_imagelocation == e_imagelocation.Top)
{
Point[] points = new Point[3];
points[0] = new Point(this.Width / 2 + 8 * _size - _imageoffset, this.Height - _imageoffset - 5 * _size);
points[1] = new Point(this.Width / 2 + 2 * _size - _imageoffset, this.Height - _imageoffset - 5 * _size);
points[2] = new Point(this.Width / 2 + 5 * _size - _imageoffset, this.Height - _imageoffset - 2 * _size);
gr.FillPolygon(new SolidBrush(_forecolor), points);
}
break;
case e_arrow.ToRight:
if (_imagelocation == e_imagelocation.Left)
{
int arrowxpos = this.Width - _splitdistance + 2 * _imageoffset;
Point[] points = new Point[3];
points[0] = new Point(arrowxpos + 4, this.Height / 2 - 4 * _size);
points[1] = new Point(arrowxpos + 8, this.Height / 2);
points[2] = new Point(arrowxpos + 4, this.Height / 2 + 4 * _size);
gr.FillPolygon(new SolidBrush(_forecolor), points);
}
break;
default:
break;
}
}
public void FillSplit(Graphics gr)
{
Color _tranp = Color.FromArgb(200, 255, 255, 255);
int x1 = this.Width - _splitdistance; int x2 = 0;
int y1 = this.Height - _splitdistance; int y2 = 0;
SolidBrush btransp = new SolidBrush(_tranp);
#region Horizontal
if (_imagelocation == e_imagelocation.Left)
{
if (xmouse < this.Width - _splitdistance & mouse)
{
Rectangle _r = new Rectangle(x1 + 1, 1, this.Width - 2, this.Height - 1);
GraphicsPath p = new GraphicsPath();
int _rtemp = _radius; _radius = 4;
DrawArc(_r, p);
_radius = _rtemp;
gr.FillPath(btransp, p);
}
else if (mouse)
{
Rectangle _r = new Rectangle(x2 + 1, 1, this.Width - _splitdistance - 1, this.Height - 1);
GraphicsPath p = new GraphicsPath();
int _rtemp = _radius; _radius = 4;
DrawArc(_r, p);
_radius = _rtemp;
gr.FillPath(btransp, p);
}
}
#endregion
#region Vertical
else if (_imagelocation == e_imagelocation.Top)
{
if (ymouse < this.Height - _splitdistance & mouse)
{
Rectangle _r = new Rectangle(1, y1 + 1, this.Width - 1, this.Height - 1);
GraphicsPath p = new GraphicsPath();
int _rtemp = _radius; _radius = 4;
DrawArc(_r, p);
_radius = _rtemp;
gr.FillPath(btransp, p);
}
else if (mouse)
{
Rectangle _r = new Rectangle(1, y2 + 1, this.Width - 1, this.Height - _splitdistance - 1);
GraphicsPath p = new GraphicsPath();
int _rtemp = _radius; _radius = 4;
DrawArc(_r, p);
_radius = _rtemp;
gr.FillPath(btransp, p);
}
}
#endregion
btransp.Dispose();
}
#endregion
#region About Fading
private Timer timer1 = new Timer();
int i_factor = 35;
public int FadingSpeed
{
get { return i_factor; }
set
{
if (value > -1)
{
i_factor = value;
}
}
}
int i_fR = 1; int i_fG = 1; int i_fB = 1; int i_fA = 1;
void timer1_Tick(object sender, EventArgs e)
{
#region Entering
if (i_mode == 1)
{
if (System.Math.Abs(ColorOn.R - R0) > i_factor)
{ i_fR = i_factor; }
else { i_fR = 1; }
if (System.Math.Abs(ColorOn.G - G0) > i_factor)
{ i_fG = i_factor; }
else { i_fG = 1; }
if (System.Math.Abs(ColorOn.B - B0) > i_factor)
{ i_fB = i_factor; }
else { i_fB = 1; }
if (ColorOn.R < R0)
{
R0 -= i_fR;
}
else if (ColorOn.R > R0)
{
R0 += i_fR;
}
if (ColorOn.G < G0)
{
G0 -= i_fG;
}
else if (ColorOn.G > G0)
{
G0 += i_fG;
}
if (ColorOn.B < B0)
{
B0 -= i_fB;
}
else if (ColorOn.B > B0)
{
B0 += i_fB;
}
if (ColorOn == Color.FromArgb(R0, G0, B0))
{
timer1.Stop();
}
else
{
this.Refresh();
}
}
#endregion
#region Leaving
if (i_mode == 0)
{
if (System.Math.Abs(ColorBase.R - R0) < i_factor)
{ i_fR = 1; }
else { i_fR = i_factor; }
if (System.Math.Abs(ColorBase.G - G0) < i_factor)
{ i_fG = 1; }
else { i_fG = i_factor; }
if (System.Math.Abs(ColorBase.B - B0) < i_factor)
{ i_fB = 1; }
else { i_fB = i_factor; }
if (System.Math.Abs(ColorBase.A - A0) < i_factor)
{ i_fA = 1; }
else { i_fA = i_factor; }
if (ColorBase.R < R0)
{
R0 -= i_fR;
}
else if (ColorBase.R > R0)
{
R0 += i_fR;
}
if (ColorBase.G < G0)
{
G0 -= i_fG;
}
else if (ColorBase.G > G0)
{
G0 += i_fG;
}
if (ColorBase.B < B0)
{
B0 -= i_fB;
}
else if (ColorBase.B > B0)
{
B0 += i_fB;
}
if (ColorBase.A < A0)
{
A0 -= i_fA;
}
else if (ColorBase.A > A0)
{
A0 += i_fA;
}
if (ColorBase == Color.FromArgb(A0, R0, G0, B0))
{
timer1.Stop();
}
else
{
this.Refresh();
}
}
#endregion
this.Refresh();
}
#endregion
#region Mouse Events
int i_mode = 0;
int xmouse = 0, ymouse = 0; bool mouse = false;
protected override void OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
_colorStroke = ColorOnStroke;
_tempshowbase = _showbase;
_showbase = e_showbase.Yes;
i_mode = 1;
xmouse = PointToClient(Cursor.Position).X;
mouse = true;
A0 = 200;
if (i_factor == 0)
{
R0 = _onColor.R; G0 = _onColor.G; B0 = _onColor.B;
}
timer1.Start();
}
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
UpdateLeave();
}
public void UpdateLeave()
{
if (_keeppress == false | (_keeppress == true & _ispressed == false))
{
_colorStroke = ColorBaseStroke;
_showbase = _tempshowbase;
i_mode = 0;
mouse = false;
if (i_factor == 0)
{
R0 = _baseColor.R; G0 = _baseColor.G; B0 = _baseColor.B;
this.Refresh();
}
else
{
timer1.Stop();
timer1.Start();
}
}
}
protected override void OnMouseDown(MouseEventArgs mevent)
{
base.OnMouseDown(mevent);
R0 = ColorPress.R; G0 = ColorPress.G; B0 = ColorPress.B;
_colorStroke = ColorPressStroke;
_showbase = e_showbase.Yes;
i_mode = 2;
xmouse = PointToClient(Cursor.Position).X;
ymouse = PointToClient(Cursor.Position).Y;
mouse = true;
}
protected override void OnMouseUp(MouseEventArgs mevent)
{
R0 = ColorOn.R; G0 = ColorOn.G; B0 = ColorOn.B;
_colorStroke = ColorOnStroke;
_showbase = e_showbase.Yes;
i_mode = 1;
mouse = true;
#region ClickSplit
if (_imagelocation == e_imagelocation.Left & xmouse > this.Width - _splitdistance & _splitbutton == e_splitbutton.Yes)
{
if (_arrow == e_arrow.ToDown)
{
if (this.ContextMenuStrip != null)
this.ContextMenuStrip.Opacity = 1.0;
this.ContextMenuStrip.Show(this, 0, this.Height);
}
else if (_arrow == e_arrow.ToRight)
{
if (this.ContextMenuStrip != null)
{
ContextMenuStrip menu = this.ContextMenuStrip;
this.ContextMenuStrip.Opacity = 1.0;
if (this.MenuPos.Y == 0)
{
this.ContextMenuStrip.Show(this, this.Width + 2, -this.Height);
}
else
{
this.ContextMenuStrip.Show(this, this.Width + 2, this.MenuPos.Y);
}
}
}
}
else if (_imagelocation == e_imagelocation.Top & ymouse > this.Height - _splitdistance & _splitbutton == e_splitbutton.Yes)
{
if (_arrow == e_arrow.ToDown)
{
if (this.ContextMenuStrip != null)
this.ContextMenuStrip.Show(this, 0, this.Height);
}
}
#endregion
else
{
base.OnMouseUp(mevent);
#region Keep Press
if (_keeppress)
{
_ispressed = true;
try
{
foreach (Control _control in this.Parent.Controls)
{
if (typeof(RibbonMenuButton) == _control.GetType() & _control.Name != this.Name)
{
((RibbonMenuButton)(_control))._ispressed = false;
((RibbonMenuButton)(_control)).UpdateLeave();
}
}
}
catch { }
}
#endregion
}
}
protected override void OnMouseMove(MouseEventArgs mevent)
{
if (mouse & this.SplitButton == e_splitbutton.Yes)
{
xmouse = PointToClient(Cursor.Position).X;
ymouse = PointToClient(Cursor.Position).Y;
this.Refresh();
}
base.OnMouseMove(mevent);
}
#endregion
}
public class RibbonColor
{
#region Constructors
public RibbonColor(Color color)
{
rc = color.R;
gc = color.G;
bc = color.B;
ac = color.A;
HSV();
}
public RibbonColor(uint alpha, int hue, int saturation, int brightness)
{
hc = hue;
sc = saturation;
vc = brightness;
ac = alpha;
GetColor();
}
#endregion
#region Alpha
private uint ac = 0;
public uint AC { get { return ac; } set { System.Math.Min(value, 255); } }
#endregion
#region RGB
private int rc = 0, gc = 0, bc = 0;
public int RC { get { return rc; } set { rc = System.Math.Min(value, 255); } }
public int GC { get { return gc; } set { gc = System.Math.Min(value, 255); } }
public int BC { get { return bc; } set { bc = System.Math.Min(value, 255); } }
public Color GetColor()
{
int conv;
double hue, sat, val;
int basis;
hue = (float)hc / 100.0f;
sat = (float)sc / 100.0f;
val = (float)vc / 100.0f;
if ((float)sc == 0)
{
conv = (int)(255.0f * val);
rc = gc = bc = conv;
return Color.FromArgb((int)rc, (int)gc, (int)bc);
}
basis = (int)(255.0f * (1.0 - sat) * val);
switch ((int)((float)hc / 60.0f))
{
case 0:
rc = (int)(255.0f * val);
gc = (int)((255.0f * val - basis) * (hc / 60.0f) + basis);
bc = (int)basis;
break;
case 1:
rc = (int)((255.0f * val - basis) * (1.0f - ((hc % 60) / 60.0f)) + basis);
gc = (int)(255.0f * val);
bc = (int)basis;
break;
case 2:
rc = (int)basis;
gc = (int)(255.0f * val);
bc = (int)((255.0f * val - basis) * ((hc % 60) / 60.0f) + basis);
break;
case 3:
rc = (int)basis;
gc = (int)((255.0f * val - basis) * (1.0f - ((hc % 60) / 60.0f)) + basis);
bc = (int)(255.0f * val);
break;
case 4:
rc = (int)((255.0f * val - basis) * ((hc % 60) / 60.0f) + basis);
gc = (int)basis;
bc = (int)(255.0f * val);
break;
case 5:
rc = (int)(255.0f * val);
gc = (int)basis;
bc = (int)((255.0f * val - basis) * (1.0f - ((hc % 60) / 60.0f)) + basis);
break;
}
return Color.FromArgb((int)ac, (int)rc, (int)gc, (int)bc);
}
public uint GetRed()
{
return GetColor().R;
}
public uint GetGreen()
{
return GetColor().G;
}
public uint GetBlue()
{
return GetColor().B;
}
#endregion
#region HSV
private int hc = 0, sc = 0, vc = 0;
public float HC { get { return hc; } set { hc = (int)System.Math.Min(value, 359); hc = (int)System.Math.Max(hc, 0); } }
public float SC { get { return sc; } set { sc = (int)System.Math.Min(value, 100); sc = (int)System.Math.Max(sc, 0); } }
public float VC { get { return vc; } set { vc = (int)System.Math.Min(value, 100); vc = (int)System.Math.Max(vc, 0); } }
public enum C { Red, Green, Blue, None }
private int maxval = 0, minval = 0;
private C CompMax, CompMin;
private void HSV()
{
hc = this.GetHue();
sc = this.GetSaturation();
vc = this.GetBrightness();
}
public void CMax()
{
if (rc > gc)
{
if (rc < bc) { maxval = bc; CompMax = C.Blue; }
else { maxval = rc; CompMax = C.Red; }
}
else
{
if (gc < bc) { maxval = bc; CompMax = C.Blue; }
else { maxval = gc; CompMax = C.Green; }
}
}
public void CMin()
{
if (rc < gc)
{
if (rc > bc) { minval = bc; CompMin = C.Blue; }
else { minval = rc; CompMin = C.Red; }
}
else
{
if (gc > bc) { minval = bc; CompMin = C.Blue; }
else { minval = gc; CompMin = C.Green; }
}
}
public int GetBrightness()
{
CMax(); return 100 * maxval / 255;
}
public int GetSaturation()
{
CMax(); CMin();
if (CompMax == C.None)
return 0;
else if (maxval != minval)
{
Decimal d_sat = Decimal.Divide(minval, maxval);
d_sat = Decimal.Subtract(1, d_sat);
d_sat = Decimal.Multiply(d_sat, 100);
return Convert.ToUInt16(d_sat);
}
else
{
return 0;
}
}
public int GetHue()
{
CMax(); CMin();
if (maxval == minval)
{
return 0;
}
else if (CompMax == C.Red)
{
if (gc >= bc)
{
Decimal d1 = Decimal.Divide((gc - bc), (maxval - minval));
return Convert.ToUInt16(60 * d1);
}
else
{
Decimal d1 = Decimal.Divide((bc - gc), (maxval - minval));
d1 = 60 * d1;
return Convert.ToUInt16(360 - d1);
}
}
else if (CompMax == C.Green)
{
if (bc >= rc)
{
Decimal d1 = Decimal.Divide((bc - rc), (maxval - minval));
d1 = 60 * d1;
return Convert.ToUInt16(120 + d1);
}
else
{
Decimal d1 = Decimal.Divide((rc - bc), (maxval - minval));
d1 = 60 * d1;
return Convert.ToUInt16(120 - d1);
}
}
else if (CompMax == C.Blue)
{
if (rc >= gc)
{
Decimal d1 = Decimal.Divide((rc - gc), (maxval - minval));
d1 = 60 * d1;
return Convert.ToUInt16(240 + d1);
}
else
{
Decimal d1 = Decimal.Divide((gc - rc), (maxval - minval));
d1 = 60 * d1;
return Convert.ToUInt16(240 - d1);
}
}
else
{
return 0;
}
}
#endregion
#region Methods
public bool IsDark()
{
if (BC > 50)
{
return false;
}
else
{
return true;
}
}
public void IncreaseBrightness(int val)
{
this.VC = this.VC + val;
}
public void SetBrightness(int val)
{
this.VC = val;
}
public void IncreaseHue(int val)
{
this.HC = this.HC + val;
}
public void SetHue(int val)
{
this.HC = val;
}
public void IncreaseSaturation(int val)
{
this.SC = this.SC + val;
}
public void SetSaturation(int val)
{
this.SC = val;
}
public Color IncreaseHSV(int h, int s, int b)
{
this.HC = this.HC + h;
this.SC = this.SC + s;
this.VC = this.VC + b;
return GetColor();
}
#endregion
}
|
|
|
|
|
It is incredible that these days from 2007 my code continues making being useful a lot. When I finish my last project I will review all the messages to create another version. Thank you all.
|
|
|
|
|
hermoso, me viene barvaro y como recien empieso no puedo hacerlo yo mismo gracias.
|
|
|
|
|
|
|
It is really sad that this control is rated so highly (perception rules) as it was very poorly written and is barely usable within a real application. Still, the overall drawing concepts were reasonable so I decided to spend 4 hours or so trying to make it more reasonable. After the 4 hours I think most of the common problems are resolved but I stopped once the basic functionality was no longer complete junk. All in all, this control could have been written correctly in about 4 hours so I don't think there is any point in wasting more time on it, but if I fix any other bugs I will update my solution (but not this post.)
The re-factoring will break existing code but most of the changes are relatively easy to fix.
The solution below is VS 2010. You can obviouly jack the code into the existing solution...but I leave that up to you.
https://sites.google.com/site/atomicdog63/home/RibbonMenuControlTest.zip?attredirects=0&d=1[^]
Tom Guinther
http://mothership.blogdns.net/cs/blog
|
|
|
|
|
Fine, Excellent, Indispensable. Thank You.
|
|
|
|
|
Fine, Excellent, Indispensable. Thank You.
|
|
|
|
|
|
I really love this, thanks!
|
|
|
|
|
|
how excellent it's
i do like it!
|
|
|
|
|
Hi.
When I set TextAlign to right or left It hasn't any effect.
sepel
|
|
|
|
|
Thanks for the damn nice article...5
TVMU^P[[IGIOQHG^JSH`A#@`RFJ\c^JPL>;"[,*/|+&WLEZGc`AFXc!L
%^]*IRXD#@GKCQ`R\^SF_WcHbORY87֦ʻ6ϣN8ȤBcRAV\Z^&SU~%CSWQ@#2
W_AD`EPABIKRDFVS)EVLQK)JKSQXUFYK[M`UKs*$GwU#(QDXBER@CBN%
Rs0~53%eYrd8mt^7Z6]iTF+(EWfJ9zaK-iTV.C\y<pjxsg-b$f4ia>
--------------------------------------------------------
128 bit encrypted signature, crack if you can
|
|
|
|
|
Hi there is it possible to use this class in commercial project withour any restrictions ?
|
|
|
|
|
|
When I set ForeColor as Gray or tints of Gray Button text color become red or tints of red.
Help me please... Why gray became red?
|
|
|
|
|
Hi,
Thank you again for your work , it is amazing
I will be so happy and thankful if you answer me about my questions.
I am not so proffesional in C# .Net , but I am trying to dive deeply into this amazing language, I am software engineer since 8 years , but working with C++, emebdded .
1. How can you create dll and then add it to the ToolBox in order to have new tools that we can drag it to our controls??
2. How can you create specific ICon Image and locate it in its place in teh control??
3. whic resources, articles, researches did you use in order to study all of this stuff??
I will be thankfull i fyou can provice me with all the needed in order to start develp things like this??
thank you
Wael
Wael...Where Imagination Is Touched...
|
|
|
|
|
|
public class RibbonMenuButton : Button
{
#region About Constructor
public RibbonMenuButton()
{
this.SetStyle(ControlStyles.SupportsTransparentBackColor |
ControlStyles.UserPaint |
ControlStyles.ResizeRedraw |
ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.Opaque, false);
this.FlatAppearance.BorderSize = 0;
this.FlatStyle = FlatStyle.Flat;
this.BackColor = Color.Transparent;
timer1.Interval = 5;
timer1.Tick += new EventHandler(timer1_Tick);
}
protected override void OnCreateControl()
{
base.OnCreateControl();
A0 = ColorBase.A;
R0 = ColorBase.R;
G0 = ColorBase.G;
B0 = ColorBase.B;
_colorStroke = _baseStroke;
Rectangle r = new Rectangle(new Point(-1, -1), new Size(this.Width + _radius, this.Height + _radius));
#region Transform to SmoothRectangle Region
if (this.Size != null)
{
GraphicsPath pathregion = new GraphicsPath();
DrawArc(r, pathregion);
this.Region = new Region(pathregion);
}
#endregion
}
#endregion
#region About Image Settings
private e_imagelocation _imagelocation;
public enum e_imagelocation
{
Top, Bottom, Left, Right, None
}
public e_imagelocation ImageLocation
{
get { return _imagelocation; }
set { _imagelocation = value; this.Refresh(); }
}
private int _imageoffset;
public int ImageOffset
{
get { return _imageoffset; }
set { _imageoffset = value; }
}
private Point _maximagesize;
public Point MaxImageSize
{
get { return _maximagesize; }
set { _maximagesize = value; }
}
#endregion
#region About Button Settings
private e_showbase _showbase;
private e_showbase _tempshowbase;
public enum e_showbase
{
Yes, No
}
public e_showbase ShowBase
{
get { return _showbase; }
set { _showbase = value; this.Refresh(); }
}
private int _radius = 6;
public int Radius
{
get { return _radius; }
set
{
if (value > 0)
{
_radius = value;
}else{
_radius = 2;
}
this.Refresh();
}
}
private e_groupPos _grouppos;
public enum e_groupPos
{
None, Left, Center, Right, Top, Bottom
}
public e_groupPos GroupPos
{
get { return _grouppos; }
set { _grouppos = value; this.Refresh(); }
}
private e_arrow _arrow;
public enum e_arrow
{
None, ToRight, ToDown
}
public e_arrow Arrow
{
get { return _arrow; }
set { _arrow = value; this.Refresh(); }
}
private e_splitbutton _splitbutton;
public enum e_splitbutton
{
No, Yes
}
public e_splitbutton SplitButton
{
get { return _splitbutton; }
set { _splitbutton = value; this.Refresh(); }
}
private int _splitdistance = 0;
public int SplitDistance
{
get { return _splitdistance; }
set { _splitdistance = value; this.Refresh(); }
}
private string _title = "";
public string Title
{
get { return _title; }
set { _title = value; this.Refresh(); }
}
private bool _keeppress = false;
public bool KeepPress
{
get { return _keeppress; }
set { _keeppress = value; }
}
private bool _ispressed = false;
public bool IsPressed
{
get { return _ispressed; }
set { _ispressed = value; }
}
#endregion
#region Menu Pos
private Point _menupos = new Point(0, 0);
public Point MenuPos
{
get { return _menupos; }
set { _menupos = value; }
}
#endregion
#region Colors
private Color _baseColor = Color.FromArgb(186, 209, 240);
private Color _onColor = Color.FromArgb(255, 214, 78);
private Color _pressColor = Color.FromArgb(255, 128, 0);
private Color _baseStroke = Color.FromArgb(152, 187, 213);
private Color _onStroke = Color.FromArgb(196, 177, 118);
private Color _pressStroke = Color.FromArgb(128, 64, 0);
private Color _colorStroke = Color.FromArgb(255, 255, 255);
private int A0, R0, G0, B0;
public Color ColorBase
{
get { return _baseColor; }
set
{
_baseColor = value;
R0 = _baseColor.R;
B0 = _baseColor.B;
G0 = _baseColor.G;
A0 = _baseColor.A;
RibbonColor hsb = new RibbonColor(_baseColor);
if (hsb.BC < 50)
{
hsb.SetBrightness(60);
}
else
{
hsb.SetBrightness(30);
}
if (_baseColor.A > 0)
_baseStroke = Color.FromArgb(100, hsb.GetColor());
else
_baseStroke = Color.FromArgb(0, hsb.GetColor());
this.Refresh();
}
}
public Color ColorOn
{
get { return _onColor; }
set
{
_onColor = value;
RibbonColor hsb = new RibbonColor(_onColor);
if (hsb.BC < 50)
{
hsb.SetBrightness(60);
}
else
{
hsb.SetBrightness(30);
}
if (_baseStroke.A > 0)
_onStroke = Color.FromArgb(100, hsb.GetColor());
else
_onStroke = Color.FromArgb(0, hsb.GetColor());
this.Refresh();
}
}
public Color ColorPress
{
get { return _pressColor; }
set
{
_pressColor = value;
RibbonColor hsb = new RibbonColor(_pressColor);
if (hsb.BC < 50)
{
hsb.SetBrightness(60);
}
else
{
hsb.SetBrightness(30);
}
if (_baseStroke.A > 0)
_pressStroke = Color.FromArgb(100, hsb.GetColor());
else
_pressStroke = Color.FromArgb(0, hsb.GetColor());
this.Refresh();
}
}
public Color ColorBaseStroke
{
get { return _baseStroke; }
set { _baseStroke = value; }
}
public Color ColorOnStroke
{
get { return _onStroke; }
set { _onStroke = value; }
}
public Color ColorPressStroke
{
get { return _pressStroke; }
set { _pressStroke = value; }
}
public Color GetColorIncreased(Color color, int h, int s, int b)
{
RibbonColor _color = new RibbonColor(color);
int ss = _color.GetSaturation();
float vc = b + _color.GetBrightness();
float hc = h + _color.GetHue();
float sc = s + ss;
_color.VC = vc;
_color.HC = hc;
_color.SC = sc;
return _color.GetColor();
}
public Color GetColor(int A, int R, int G, int B)
{
if (A + A0 > 255) { A = 255; } else { A = A + A0; }
if (R + R0 > 255) { R = 255; } else { R = R + R0; }
if (G + G0 > 255) { G = 255; } else { G = G + G0; }
if (B + B0 > 255) { B = 255; } else { B = B + B0; }
return Color.FromArgb(A, R, G, B);
}
#endregion
protected override void OnPaint(PaintEventArgs pevent)
{
#region Variables & Conf
Graphics g = pevent.Graphics;
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.High;
Rectangle r = new Rectangle(new Point(-1, -1), new Size(this.Width + _radius, this.Height + _radius));
#endregion
#region Paint
GraphicsPath path = new GraphicsPath();
Rectangle rp = new Rectangle(new Point(0, 0), new Size(this.Width - 1, this.Height - 1));
DrawArc(rp, path);
FillGradients(g, path);
DrawImage(g);
DrawString(g);
DrawArrow(g);
#endregion
}
protected override void OnResize(EventArgs e)
{
Rectangle r = new Rectangle(new Point(-1, -1), new Size(this.Width + _radius, this.Height + _radius));
if (this.Size != null)
{
GraphicsPath pathregion = new GraphicsPath();
DrawArc(r, pathregion);
this.Region = new Region(pathregion);
}
base.OnResize(e);
}
#region Paint Methods
public void FillGradients(Graphics gr, GraphicsPath pa)
{
int origin = this.Height / 3; int end = this.Height; int oe = (end - origin) / 2;
LinearGradientBrush lgbrush; Rectangle rect;
if (_showbase == e_showbase.Yes)
{
rect = new Rectangle(new Point(0, 0), new Size(this.Width - 1, this.Height - 1));
pa = new GraphicsPath();
DrawArc(rect, pa);
lgbrush = new LinearGradientBrush(rect, Color.Transparent, Color.Transparent, LinearGradientMode.Vertical);
#region Main Gradient
float[] pos = new float[4];
pos[0] = 0.0F; pos[1] = 0.3F; pos[2] = 0.35F; pos[3] = 1.0F;
Color[] colors = new Color[4];
if (i_mode == 0)
{
colors[0] = GetColor(0, 35, 24, 9);
colors[1] = GetColor(0, 13, 8, 3);
colors[2] = Color.FromArgb(A0, R0, G0, B0);
colors[3] = GetColor(0, 28, 29, 14);
}
else
{
colors[0] = GetColor(0, 0, 50, 100);
colors[1] = GetColor(0, 0, 0, 30);
colors[2] = Color.FromArgb(A0, R0, G0, B0);
colors[3] = GetColor(0, 0, 50, 100);
}
ColorBlend mix = new ColorBlend();
mix.Colors = colors;
mix.Positions = pos;
lgbrush.InterpolationColors = mix;
gr.FillPath(lgbrush, pa);
#endregion
#region Fill Band
rect = new Rectangle(new Point(0, 0), new Size(this.Width, this.Height / 3));
pa = new GraphicsPath(); int _rtemp = _radius; _radius = _rtemp - 1;
DrawArc(rect, pa);
if (A0 > 80)
{
gr.FillPath(new SolidBrush(Color.FromArgb(60, 255, 255, 255)), pa);
}
_radius = _rtemp;
#endregion
#region SplitFill
if (_splitbutton == e_splitbutton.Yes & mouse)
{
FillSplit(gr);
}
#endregion
#region Shadow
if (i_mode == 2)
{
rect = new Rectangle(1, 1, this.Width - 2, this.Height);
pa = new GraphicsPath();
DrawShadow(rect, pa);
gr.DrawPath(new Pen(Color.FromArgb(50, 20, 20, 20), 2.0F), pa);
}
else
{
rect = new Rectangle(1, 1, this.Width - 2, this.Height - 1);
pa = new GraphicsPath();
DrawShadow(rect, pa);
if (A0 > 80)
{
gr.DrawPath(new Pen(Color.FromArgb(100, 250, 250, 250), 3.0F), pa);
}
}
#endregion
#region SplitLine
if (_splitbutton == e_splitbutton.Yes)
{
if (_imagelocation == e_imagelocation.Top)
{
switch (i_mode)
{
case 1:
gr.DrawLine(new Pen(_onStroke), new Point(1, this.Height - _splitdistance), new Point(this.Width - 1, this.Height - _splitdistance));
break;
case 2:
gr.DrawLine(new Pen(_pressStroke), new Point(1, this.Height - _splitdistance), new Point(this.Width - 1, this.Height - _splitdistance));
break;
default:
break;
}
}
else if (_imagelocation == e_imagelocation.Left)
{
switch (i_mode)
{
case 1:
gr.DrawLine(new Pen(_onStroke), new Point(this.Width - _splitdistance, 0), new Point(this.Width - _splitdistance, this.Height));
break;
case 2:
gr.DrawLine(new Pen(_pressStroke), new Point(this.Width - _splitdistance, 0), new Point(this.Width - _splitdistance, this.Height));
break;
default:
break;
}
}
}
#endregion
rect = new Rectangle(new Point(0, 0), new Size(this.Width - 1, this.Height - 1));
pa = new GraphicsPath();
DrawArc(rect, pa);
gr.DrawPath(new Pen(_colorStroke, 0.9F), pa);
pa.Dispose(); lgbrush.Dispose();
}
}
int offsetx = 0, offsety = 0, imageheight = 0, imagewidth = 0;
public void DrawImage(Graphics gr)
{
if (this.Image != null)
{
offsety = _imageoffset; offsetx = _imageoffset;
if (_imagelocation == e_imagelocation.Left | _imagelocation == e_imagelocation.Right)
{
imageheight = this.Height - offsety * 2;
if (imageheight > _maximagesize.Y & _maximagesize.Y != 0)
{ imageheight = _maximagesize.Y; }
imagewidth = (int)((Convert.ToDouble(imageheight) / this.Image.Height) * this.Image.Width);
}
else if (_imagelocation == e_imagelocation.Top | _imagelocation == e_imagelocation.Bottom)
{
imagewidth = this.Width - offsetx * 2;
if (imagewidth > _maximagesize.X & _maximagesize.X != 0)
{ imagewidth = _maximagesize.X; }
imageheight = (int)((Convert.ToDouble(imagewidth) / this.Image.Width) * this.Image.Height);
}
switch (_imagelocation)
{
case e_imagelocation.Left:
gr.DrawImage(this.Image, new Rectangle(offsetx, offsety, imagewidth, imageheight));
break;
case e_imagelocation.Right:
gr.DrawImage(this.Image, new Rectangle(this.Width - imagewidth - offsetx, offsety, imagewidth, imageheight));
break;
case e_imagelocation.Top:
offsetx = this.Width / 2 - imagewidth / 2;
gr.DrawImage(this.Image, new Rectangle(offsetx, offsety, imagewidth, imageheight));
break;
case e_imagelocation.Bottom:
gr.DrawImage(this.Image, new Rectangle(offsetx, this.Height - imageheight - offsety, imagewidth, imageheight));
break;
default:
break;
}
}
}
public void DrawString(Graphics gr)
{
if (this.Text != "")
{
int textwidth = (int)gr.MeasureString(this.Text, this.Font).Width;
int textheight = (int)gr.MeasureString(this.Text, this.Font).Height;
int extraoffset = 0;
Font fontb = new Font(this.Font, FontStyle.Bold);
if (_title != "")
{
extraoffset = textheight / 2;
}
string s1 = this.Text; string s2 = "";
int jump = this.Text.IndexOf("\\n");
if (jump != -1)
{
s2 = s1.Substring(jump + 3); s1 = s1.Substring(0, jump);
}
#region Calc Color Brightness
RibbonColor __color = new RibbonColor(Color.FromArgb(R0, G0, B0));
RibbonColor forecolor = new RibbonColor(this.ForeColor);
Color _forecolor;
if (__color.GetBrightness() > 50)
{
forecolor.BC = 1;
forecolor.SC = 80;
}
else
{
forecolor.BC = 99;
forecolor.SC = 20;
}
_forecolor = forecolor.GetColor();
#endregion
if (this.Image == null)
{
switch (this.TextAlign)
{
case ContentAlignment.BottomCenter:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(this.Width / 2 - textwidth / 2 - 1, this.Height - textheight - 1));
break;
case ContentAlignment.BottomLeft:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(1, this.Height - textheight - 1));
break;
case ContentAlignment.BottomRight:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(this.Width - textwidth - 1, this.Height - textheight - 1));
break;
case ContentAlignment.MiddleCenter:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(this.Width / 2 - textwidth / 2 - 1, this.Height / 2 - textheight / 2 - 1));
break;
case ContentAlignment.MiddleLeft:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(1, this.Height / 2 - textheight / 2 - 1));
break;
case ContentAlignment.MiddleRight:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(this.Width - textwidth - 1, this.Height / 2 - textheight / 2 - 1));
break;
case ContentAlignment.TopCenter:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(this.Width / 2 - textwidth / 2 - 1, 1));
break;
case ContentAlignment.TopLeft:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(1, 1));
break;
case ContentAlignment.TopRight:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(this.Width - textwidth - 1, 1));
break;
default:
break;
}
}else{
switch (_imagelocation)
{
case e_imagelocation.Left:
if (this.Title != "")
{
gr.DrawString(this.Title, fontb, new SolidBrush(_forecolor), new PointF(offsetx + imagewidth + 4, this.Font.Size / 2));
gr.DrawString(s1, this.Font, new SolidBrush(_forecolor), new PointF(offsetx + imagewidth + 4, 2 * this.Font.Size + 1));
gr.DrawString(s2, this.Font, new SolidBrush(_forecolor), new PointF(offsetx + imagewidth + 4, 3 * this.Font.Size + 4));
}
else
{
gr.DrawString(s1, this.Font, new SolidBrush(_forecolor), new PointF(offsetx + imagewidth + 4, this.Height / 2 - this.Font.Size + 1));
}
break;
case e_imagelocation.Right:
gr.DrawString(this.Title, fontb, new SolidBrush(_forecolor), new PointF(offsetx, this.Height / 2 - this.Font.Size + 1 - extraoffset));
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(offsetx, extraoffset + this.Height / 2 - this.Font.Size + 1));
break;
case e_imagelocation.Top:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(this.Width / 2 - textwidth / 2 - 1, offsety + imageheight));
break;
case e_imagelocation.Bottom:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(this.Width / 2 - textwidth / 2 - 1, this.Height - imageheight - textheight - 1));
break;
case e_imagelocation.None:
gr.DrawString(this.Text, this.Font, new SolidBrush(_forecolor), new PointF(this.Width / 2 - textwidth / 2 - 1, this.Height / 2 - textheight / 2 - 1));
break;
default:
break;
}
}
fontb.Dispose();
}
}
public void DrawArc(Rectangle re, GraphicsPath pa)
{
int _radiusX0Y0 = _radius, _radiusXFY0 = _radius, _radiusX0YF = _radius, _radiusXFYF = _radius;
switch (_grouppos)
{
case e_groupPos.Left:
_radiusXFY0 = 1; _radiusXFYF = 1;
break;
case e_groupPos.Center:
_radiusX0Y0 = 1; _radiusX0YF = 1; _radiusXFY0 = 1; _radiusXFYF = 1;
break;
case e_groupPos.Right:
_radiusX0Y0 = 1; _radiusX0YF = 1;
break;
case e_groupPos.Top:
_radiusX0YF = 1; _radiusXFYF = 1;
break;
case e_groupPos.Bottom:
_radiusX0Y0 = 1; _radiusXFY0 = 1;
break;
}
pa.AddArc(re.X, re.Y, _radiusX0Y0, _radiusX0Y0, 180, 90);
pa.AddArc(re.Width - _radiusXFY0, re.Y, _radiusXFY0, _radiusXFY0, 270, 90);
pa.AddArc(re.Width - _radiusXFYF, re.Height - _radiusXFYF, _radiusXFYF, _radiusXFYF, 0, 90);
pa.AddArc(re.X, re.Height - _radiusX0YF, _radiusX0YF, _radiusX0YF, 90, 90);
pa.CloseFigure();
}
public void DrawShadow(Rectangle re, GraphicsPath pa)
{
int _radiusX0Y0 = _radius, _radiusXFY0 = _radius, _radiusX0YF = _radius, _radiusXFYF = _radius;
switch (_grouppos)
{
case e_groupPos.Left:
_radiusXFY0 = 1; _radiusXFYF = 1;
break;
case e_groupPos.Center:
_radiusX0Y0 = 1; _radiusX0YF = 1; _radiusXFY0 = 1; _radiusXFYF = 1;
break;
case e_groupPos.Right:
_radiusX0Y0 = 1; _radiusX0YF = 1;
break;
case e_groupPos.Top:
_radiusX0YF = 1; _radiusXFYF = 1;
break;
case e_groupPos.Bottom:
_radiusX0Y0 = 1; _radiusXFY0 = 1;
break;
}
pa.AddArc(re.X, re.Y, _radiusX0Y0, _radiusX0Y0, 180, 90);
pa.AddArc(re.Width - _radiusXFY0, re.Y, _radiusXFY0, _radiusXFY0, 270, 90);
pa.AddArc(re.Width - _radiusXFYF, re.Height - _radiusXFYF, _radiusXFYF, _radiusXFYF, 0, 90);
pa.AddArc(re.X, re.Height - _radiusX0YF, _radiusX0YF, _radiusX0YF, 90, 90);
pa.CloseFigure();
}
public void DrawArrow(Graphics gr)
{
int _size = 1;
RibbonColor __color = new RibbonColor(Color.FromArgb(R0, G0, B0));
RibbonColor forecolor = new RibbonColor(this.ForeColor);
Color _forecolor;
if (__color.GetBrightness() > 50)
{
forecolor.BC = 1;
forecolor.SC = 80;
}
else
{
forecolor.BC = 99;
forecolor.SC = 20;
}
_forecolor = forecolor.GetColor();
switch (_arrow)
{
case e_arrow.ToDown:
if (_imagelocation == e_imagelocation.Left)
{
Point[] points = new Point[3];
points[0] = new Point(this.Width - 8 * _size - _imageoffset, this.Height / 2 - _size / 2);
points[1] = new Point(this.Width - 2 * _size - _imageoffset, this.Height / 2 - _size / 2);
points[2] = new Point(this.Width - 5 * _size - _imageoffset, this.Height / 2 + _size * 2);
gr.FillPolygon(new SolidBrush(_forecolor), points);
}
else if (_imagelocation == e_imagelocation.Top)
{
Point[] points = new Point[3];
points[0] = new Point(this.Width / 2 + 8 * _size - _imageoffset, this.Height - _imageoffset - 5 * _size);
points[1] = new Point(this.Width / 2 + 2 * _size - _imageoffset, this.Height - _imageoffset - 5 * _size);
points[2] = new Point(this.Width / 2 + 5 * _size - _imageoffset, this.Height - _imageoffset - 2 * _size);
gr.FillPolygon(new SolidBrush(_forecolor), points);
}
break;
case e_arrow.ToRight:
if (_imagelocation == e_imagelocation.Left)
{
int arrowxpos = this.Width - _splitdistance + 2 * _imageoffset;
Point[] points = new Point[3];
points[0] = new Point(arrowxpos + 4, this.Height / 2 - 4 * _size);
points[1] = new Point(arrowxpos + 8, this.Height / 2);
points[2] = new Point(arrowxpos + 4, this.Height / 2 + 4 * _size);
gr.FillPolygon(new SolidBrush(_forecolor), points);
}
break;
default:
break;
}
}
public void FillSplit(Graphics gr)
{
Color _tranp = Color.FromArgb(200, 255, 255, 255);
int x1 = this.Width - _splitdistance; int x2 = 0;
int y1 = this.Height - _splitdistance; int y2 = 0;
SolidBrush btransp = new SolidBrush(_tranp);
#region Horizontal
if (_imagelocation == e_imagelocation.Left)
{
if (xmouse < this.Width - _splitdistance & mouse) //Small button
{
Rectangle _r = new Rectangle(x1 + 1, 1, this.Width - 2, this.Height - 1);
GraphicsPath p = new GraphicsPath();
int _rtemp = _radius; _radius = 4;
DrawArc(_r, p);
_radius = _rtemp;
gr.FillPath(btransp, p);
}
else if (mouse) //Big Button
{
Rectangle _r = new Rectangle(x2 + 1, 1, this.Width - _splitdistance - 1, this.Height - 1);
GraphicsPath p = new GraphicsPath();
int _rtemp = _radius; _radius = 4;
DrawArc(_r, p);
_radius = _rtemp;
gr.FillPath(btransp, p);
}
}
#endregion
#region Vertical
else if (_imagelocation == e_imagelocation.Top)
{
if (ymouse < this.Height - _splitdistance & mouse) //Small button
{
Rectangle _r = new Rectangle(1, y1 + 1, this.Width - 1, this.Height - 1);
GraphicsPath p = new GraphicsPath();
int _rtemp = _radius; _radius = 4;
DrawArc(_r, p);
_radius = _rtemp;
gr.FillPath(btransp, p);
}
else if (mouse) //Big Button
{
Rectangle _r = new Rectangle(1, y2 + 1, this.Width - 1, this.Height - _splitdistance - 1);
GraphicsPath p = new GraphicsPath();
int _rtemp = _radius; _radius = 4;
DrawArc(_r, p);
_radius = _rtemp;
gr.FillPath(btransp, p);
}
}
#endregion
btransp.Dispose();
}
#endregion
#region About Fading
private Timer timer1 = new Timer();
int i_factor = 35;
public int FadingSpeed
{
get { return i_factor; }
set
{
if (value > -1)
{
i_factor = value;
}
}
}
int i_fR = 1; int i_fG = 1; int i_fB = 1; int i_fA = 1;
void timer1_Tick(object sender, EventArgs e)
{
#region Entering
if (i_mode == 1)
{
if (System.Math.Abs(ColorOn.R - R0) > i_factor)
{ i_fR = i_factor; }
else { i_fR = 1; }
if (System.Math.Abs(ColorOn.G - G0) > i_factor)
{ i_fG = i_factor; }
else { i_fG = 1; }
if (System.Math.Abs(ColorOn.B - B0) > i_factor)
{ i_fB = i_factor; }
else { i_fB = 1; }
if (ColorOn.R < R0)
{
R0 -= i_fR;
}
else if (ColorOn.R > R0)
{
R0 += i_fR;
}
if (ColorOn.G < G0)
{
G0 -= i_fG;
}
else if (ColorOn.G > G0)
{
G0 += i_fG;
}
if (ColorOn.B < B0)
{
B0 -= i_fB;
}
else if (ColorOn.B > B0)
{
B0 += i_fB;
}
if (ColorOn == Color.FromArgb(R0, G0, B0))
{
timer1.Stop();
}
else
{
this.Refresh();
}
}
#endregion
#region Leaving
if (i_mode == 0)
{
if (System.Math.Abs(ColorBase.R - R0) < i_factor)
{ i_fR = 1; }
else { i_fR = i_factor; }
if (System.Math.Abs(ColorBase.G - G0) < i_factor)
{ i_fG = 1; }
else { i_fG = i_factor; }
if (System.Math.Abs(ColorBase.B - B0) < i_factor)
{ i_fB = 1; }
else { i_fB = i_factor; }
if (System.Math.Abs(ColorBase.A - A0) < i_factor)
{ i_fA = 1; }
else { i_fA = i_factor; }
if (ColorBase.R < R0)
{
R0 -= i_fR;
}
else if (ColorBase.R > R0)
{
R0 += i_fR;
}
if (ColorBase.G < G0)
{
G0 -= i_fG;
}
else if (ColorBase.G > G0)
{
G0 += i_fG;
}
if (ColorBase.B < B0)
{
B0 -= i_fB;
}
else if (ColorBase.B > B0)
{
B0 += i_fB;
}
if (ColorBase.A < A0)
{
A0 -= i_fA;
}
else if (ColorBase.A > A0)
{
A0 += i_fA;
}
if (ColorBase == Color.FromArgb(A0, R0, G0, B0))
{
timer1.Stop();
}
else
{
this.Refresh();
}
}
#endregion
this.Refresh();
}
#endregion
#region Mouse Events
int i_mode = 0; //0 Entering, 1 Out,2 Press
int xmouse = 0, ymouse = 0; bool mouse = false;
protected override void OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
_colorStroke = ColorOnStroke;
_tempshowbase = _showbase;
_showbase = e_showbase.Yes;
i_mode = 1;
xmouse = PointToClient(Cursor.Position).X;
mouse = true;
A0 = 200;
if (i_factor == 0)
{
R0 = _onColor.R; G0 = _onColor.G; B0 = _onColor.B;
}
timer1.Start();
}
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
UpdateLeave();
}
public void UpdateLeave()
{
if (_keeppress == false | (_keeppress == true & _ispressed == false))
{
_colorStroke = ColorBaseStroke;
_showbase = _tempshowbase;
i_mode = 0;
mouse = false;
if (i_factor == 0)
{
R0 = _baseColor.R; G0 = _baseColor.G; B0 = _baseColor.B;
this.Refresh();
}
else
{
timer1.Stop();
timer1.Start();
}
}
}
protected override void OnMouseDown(MouseEventArgs mevent)
{
base.OnMouseDown(mevent);
R0 = ColorPress.R; G0 = ColorPress.G; B0 = ColorPress.B;
_colorStroke = ColorPressStroke;
_showbase = e_showbase.Yes;
i_mode = 2;
xmouse = PointToClient(Cursor.Position).X;
ymouse = PointToClient(Cursor.Position).Y;
mouse = true;
}
protected override void OnMouseUp(MouseEventArgs mevent)
{
R0 = ColorOn.R; G0 = ColorOn.G; B0 = ColorOn.B;
_colorStroke = ColorOnStroke;
_showbase = e_showbase.Yes;
i_mode = 1;
mouse = true;
#region ClickSplit
if (_imagelocation == e_imagelocation.Left & xmouse > this.Width - _splitdistance & _splitbutton == e_splitbutton.Yes)
{
if (_arrow == e_arrow.ToDown)
{
if (this.ContextMenuStrip != null)
this.ContextMenuStrip.Opacity = 1.0;
this.ContextMenuStrip.Show(this, 0, this.Height);
}
else if (_arrow == e_arrow.ToRight)
{
if (this.ContextMenuStrip != null)
{
ContextMenuStrip menu = this.ContextMenuStrip;
this.ContextMenuStrip.Opacity = 1.0;
if (this.MenuPos.Y == 0)
{
this.ContextMenuStrip.Show(this, this.Width + 2, -this.Height);
}
else
{
this.ContextMenuStrip.Show(this, this.Width + 2, this.MenuPos.Y);
}
}
}
}
else if (_imagelocation == e_imagelocation.Top & ymouse > this.Height - _splitdistance & _splitbutton == e_splitbutton.Yes)
{
if (_arrow == e_arrow.ToDown)
{
if (this.ContextMenuStrip != null)
this.ContextMenuStrip.Show(this, 0, this.Height);
}
}
#endregion
else
{
base.OnMouseUp(mevent);
#region Keep Press
if (_keeppress)
{
_ispressed = true;
try
{
foreach (Control _control in this.Parent.Controls)
{
if (typeof(RibbonMenuButton) == _control.GetType() & _control.Name != this.Name)
{
((RibbonMenuButton)(_control))._ispressed = false;
((RibbonMenuButton)(_control)).UpdateLeave();
}
}
}
catch { }
}
#endregion
}
}
protected override void OnMouseMove(MouseEventArgs mevent)
{
if (mouse & this.SplitButton == e_splitbutton.Yes)
{
xmouse = PointToClient(Cursor.Position).X;
ymouse = PointToClient(Cursor.Position).Y;
this.Refresh();
}
base.OnMouseMove(mevent);
}
#endregion
}
public class RibbonColor
{
#region Constructors
public RibbonColor(Color color)
{
rc = color.R;
gc = color.G;
bc = color.B;
ac = color.A;
HSV();
}
public RibbonColor(uint alpha, int hue, int saturation, int brightness)
{
hc = hue;
sc = saturation;
vc = brightness;
ac = alpha;
GetColor();
}
#endregion
#region Alpha
private uint ac = 0; //Alpha > -1
public uint AC { get { return ac; } set { System.Math.Min(value, 255); } }
#endregion
#region RGB
private int rc = 0, gc = 0, bc = 0; //RGB Components > -1
public int RC { get { return rc; } set { rc = System.Math.Min(value, 255); } }
public int GC { get { return gc; } set { gc = System.Math.Min(value, 255); } }
public int BC { get { return bc; } set { bc = System.Math.Min(value, 255); } }
public Color GetColor()
{
int conv;
double hue, sat, val;
int basis;
hue = (float)hc / 100.0f;
sat = (float)sc / 100.0f;
val = (float)vc / 100.0f;
if ((float)sc == 0) // Gray Colors
{
conv = (int)(255.0f * val);
rc = gc = bc = conv;
return Color.FromArgb((int)rc, (int)gc, (int)bc);
}
basis = (int)(255.0f * (1.0 - sat) * val);
switch ((int)((float)hc / 60.0f))
{
case 0:
rc = (int)(255.0f * val);
gc = (int)((255.0f * val - basis) * (hc / 60.0f) + basis);
bc = (int)basis;
break;
case 1:
rc = (int)((255.0f * val - basis) * (1.0f - ((hc % 60) / 60.0f)) + basis);
gc = (int)(255.0f * val);
bc = (int)basis;
break;
case 2:
rc = (int)basis;
gc = (int)(255.0f * val);
bc = (int)((255.0f * val - basis) * ((hc % 60) / 60.0f) + basis);
break;
case 3:
rc = (int)basis;
gc = (int)((255.0f * val - basis) * (1.0f - ((hc % 60) / 60.0f)) + basis);
bc = (int)(255.0f * val);
break;
case 4:
rc = (int)((255.0f * val - basis) * ((hc % 60) / 60.0f) + basis);
gc = (int)basis;
bc = (int)(255.0f * val);
break;
case 5:
rc = (int)(255.0f * val);
gc = (int)basis;
bc = (int)((255.0f * val - basis) * (1.0f - ((hc % 60) / 60.0f)) + basis);
break;
}
return Color.FromArgb((int)ac, (int)rc, (int)gc, (int)bc);
}
public uint GetRed()
{
return GetColor().R;
}
public uint GetGreen()
{
return GetColor().G;
}
public uint GetBlue()
{
return GetColor().B;
}
#endregion
#region HSV
private int hc = 0, sc = 0, vc = 0;
public float HC { get { return hc; } set { hc = (int)System.Math.Min(value, 359); hc = (int)System.Math.Max(hc, 0); } }
public float SC { get { return sc; } set { sc = (int)System.Math.Min(value, 100); sc = (int)System.Math.Max(sc, 0); } }
public float VC { get { return vc; } set { vc = (int)System.Math.Min(value, 100); vc = (int)System.Math.Max(vc, 0); } }
public enum C { Red, Green, Blue, None }
private int maxval = 0, minval = 0;
private C CompMax, CompMin;
private void HSV()
{
hc = this.GetHue();
sc = this.GetSaturation();
vc = this.GetBrightness();
}
public void CMax()
{
if (rc > gc)
{
if (rc < bc) { maxval = bc; CompMax = C.Blue; }
else { maxval = rc; CompMax = C.Red; }
}
else
{
if (gc < bc) { maxval = bc; CompMax = C.Blue; }
else { maxval = gc; CompMax = C.Green; }
}
}
public void CMin()
{
if (rc < gc)
{
if (rc > bc) { minval = bc; CompMin = C.Blue; }
else { minval = rc; CompMin = C.Red; }
}
else
{
if (gc > bc) { minval = bc; CompMin = C.Blue; }
else { minval = gc; CompMin = C.Green; }
}
}
public int GetBrightness() //Brightness is from 0 to 100
{
CMax(); return 100 * maxval / 255;
}
public int GetSaturation() //Saturation from 0 to 100
{
CMax(); CMin();
if (CompMax == C.None)
return 0;
else if (maxval != minval)
{
Decimal d_sat = Decimal.Divide(minval, maxval);
d_sat = Decimal.Subtract(1, d_sat);
d_sat = Decimal.Multiply(d_sat, 100);
return Convert.ToUInt16(d_sat);
}
else
{
return 0;
}
}
public int GetHue()
{
CMax(); CMin();
if (maxval == minval)
{
return 0;
}
else if (CompMax == C.Red)
{
if (gc >= bc)
{
Decimal d1 = Decimal.Divide((gc - bc), (maxval - minval));
return Convert.ToUInt16(60 * d1);
}
else
{
Decimal d1 = Decimal.Divide((bc - gc), (maxval - minval));
d1 = 60 * d1;
return Convert.ToUInt16(360 - d1);
}
}
else if (CompMax == C.Green)
{
if (bc >= rc)
{
Decimal d1 = Decimal.Divide((bc - rc), (maxval - minval));
d1 = 60 * d1;
return Convert.ToUInt16(120 + d1);
}
else
{
Decimal d1 = Decimal.Divide((rc - bc), (maxval - minval));
d1 = 60 * d1;
return Convert.ToUInt16(120 - d1);
}
}
else if (CompMax == C.Blue)
{
if (rc >= gc)
{
Decimal d1 = Decimal.Divide((rc - gc), (maxval - minval));
d1 = 60 * d1;
return Convert.ToUInt16(240 + d1);
}
else
{
Decimal d1 = Decimal.Divide((gc - rc), (maxval - minval));
d1 = 60 * d1;
return Convert.ToUInt16(240 - d1);
}
}
else
{
return 0;
}
} //Hue from 0 to 100
#endregion
#region Methods
public bool IsDark()
{
if (BC > 50)
{
return false;
}
else
{
return true;
}
}
public void IncreaseBrightness(int val)
{
this.VC = this.VC + val;
}
public void SetBrightness(int val)
{
this.VC = val;
}
public void IncreaseHue(int val)
{
this.HC = this.HC + val;
}
public void SetHue(int val)
{
this.HC = val;
}
public void IncreaseSaturation(int val)
{
this.SC = this.SC + val;
}
public void SetSaturation(int val)
{
this.SC = val;
}
public Color IncreaseHSV(int h, int s, int b)
{
this.HC = this.HC + h;
this.SC = this.SC + s;
this.VC = this.VC + b;
return GetColor();
}
#endregion
}
|
|
|
|
|
I have placed two textbox and one this button.
Now when i move from one control to another by Tab key press the button don't get focus.
Whey you replace this button with normal button, the normal button get focus and it show this by border around button. But this button don't.
Can you help me ?
|
|
|
|
|
When I set ContextStripMenu to a Ribbon menu and click the button, the menu does not render itself correctly. It just is all black.
In design time, when I click the Type here area in the RibbonMenu to add a new menu item, the UI stucks in some kind of endless cycle.
Am I the only one having this trouble???
|
|
|
|
|