using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace wsControls
{
[ToolboxBitmap(typeof(TrackBar))]
[DefaultEvent("Scroll"), DefaultProperty("BarInnerColor")]
public class wsSlider : Control
{
#region [ Events ]
[Description("Event fires when the Value property changes")]
[Category("Action")]
public event EventHandler ValueChanged;
[Description("Event fires when the Slider position is changed")]
[Category("Behavior")]
public event ScrollEventHandler Scroll;
#endregion
#region [ Properties ]
#region ( thumb Properties )
private Rectangle thumbRect; //bounding rectangle of thumb area
[Browsable(false)]
public Rectangle ThumbRect
{
get { return thumbRect; }
}
private Rectangle barRect; //bounding rectangle of bar area
private Rectangle barHalfRect;
private Rectangle thumbHalfRect;
private Rectangle elapsedRect; //bounding rectangle of elapsed area
private int thumbSize = 15;
[Description("Set Slider thumb size")]
[Category("ColorSlider")]
[DefaultValue(15)]
public int ThumbSize
{
get { return thumbSize; }
set
{
if (value > 0 &
value < (barOrientation == Orientation.Horizontal ? ClientRectangle.Width : ClientRectangle.Height))
thumbSize = value;
else
throw new ArgumentOutOfRangeException(
"TrackSize has to be greather than zero and lower than half of Slider width");
Invalidate();
}
}
private GraphicsPath thumbCustomShape = null;
[Description("Set Slider's thumb's custom shape")]
[Category("ColorSlider")]
[Browsable(false)]
[DefaultValue(typeof(GraphicsPath), "null")]
public GraphicsPath ThumbCustomShape
{
get { return thumbCustomShape; }
set
{
thumbCustomShape = value;
thumbSize = (int)(barOrientation == Orientation.Horizontal ? value.GetBounds().Width : value.GetBounds().Height) + 1;
Invalidate();
}
}
private Size thumbRoundRectSize = new Size(8, 8);
[Description("Set Slider's thumb round rect size")]
[Category("ColorSlider")]
[DefaultValue(typeof(Size), "8; 8")]
public Size ThumbRoundRectSize
{
get { return thumbRoundRectSize; }
set
{
int h = value.Height, w = value.Width;
if (h <= 0) h = 1;
if (w <= 0) w = 1;
thumbRoundRectSize = new Size(w, h);
Invalidate();
}
}
private Size borderRoundRectSize = new Size(8, 8);
[Description("Set Slider's border round rect size")]
[Category("ColorSlider")]
[DefaultValue(typeof(Size), "8; 8")]
public Size BorderRoundRectSize
{
get { return borderRoundRectSize; }
set
{
int h = value.Height, w = value.Width;
if (h <= 0) h = 1;
if (w <= 0) w = 1;
borderRoundRectSize = new Size(w, h);
Invalidate();
}
}
private Orientation barOrientation = Orientation.Horizontal;
[Description("Set Slider orientation")]
[Category("ColorSlider")]
[DefaultValue(Orientation.Horizontal)]
public Orientation Orientation
{
get { return barOrientation; }
set
{
if (barOrientation != value)
{
barOrientation = value;
int temp = Width;
Width = Height;
Height = temp;
if (thumbCustomShape != null)
thumbSize =
(int)
(barOrientation == Orientation.Horizontal
? thumbCustomShape.GetBounds().Width
: thumbCustomShape.GetBounds().Height) + 1;
Invalidate();
}
}
}
#endregion
#region ( Values max,min... )
int decimals = 0;
public int Decimals
{
get { return decimals; }
set { decimals = value; }
}
private int act = 0;
public int ActTrack
{
get { return act; }
set { act = value; }
}
private int[] trackerValue = new int[10];
public int[] TrackValue
{
get { return trackerValue; }
set { trackerValue = value; Invalidate(); }
}
private bool[] trackEnable = new bool[10];
public bool[] TrackEnableed
{
get { return trackEnable; }
set { trackEnable = value; Invalidate(); }
}
private Color[] trackColor = new Color[10];
public Color[] TrackColor
{
get { return trackColor; }
set { trackColor = value; Invalidate(); }
}
/*
[Description("Set Slider value")]
[Category("ColorSlider")]
public int Value
{
get { return trackerValue[act]; }
set
{
if (value >= barMinimum & value <= barMaximum)
{
trackerValue[act] = value;
if (ValueChanged != null) ValueChanged(this, new EventArgs());
Invalidate();
}
else throw new ArgumentOutOfRangeException("Value is outside appropriate range (min, max)");
}
}
*/
private int barMinimum = 0;
[Description("Set Slider minimal point")]
[Category("ColorSlider")]
[DefaultValue(0)]
public int Minimum
{
get { return barMinimum; }
set
{
if (value < barMaximum)
{
barMinimum = value;
if (trackerValue[act] < barMinimum)
{
trackerValue[act] = barMinimum;
if (ValueChanged != null) ValueChanged(this, new EventArgs());
}
Invalidate();
}
else throw new ArgumentOutOfRangeException("Minimal value is greather than maximal one");
}
}
private int barMaximum = 100;
[Description("Set Slider maximal point")]
[Category("ColorSlider")]
[DefaultValue(100)]
public int Maximum
{
get { return barMaximum; }
set
{
if (value > barMinimum)
{
barMaximum = value;
if (trackerValue[act] > barMaximum)
{
trackerValue[act] = barMaximum;
if (ValueChanged != null) ValueChanged(this, new EventArgs());
}
Invalidate();
}
else throw new ArgumentOutOfRangeException("Maximal value is lower than minimal one");
}
}
#endregion
#region ( Small Large Changes )
private uint smallChange = 1;
[Description("Set trackbar's small change")]
[Category("ColorSlider")]
[DefaultValue(1)]
public uint SmallChange
{
get { return smallChange; }
set { smallChange = value; }
}
private uint largeChange = 5;
[Description("Set trackbar's large change")]
[Category("ColorSlider")]
[DefaultValue(5)]
public uint LargeChange
{
get { return largeChange; }
set { largeChange = value; }
}
#endregion
#region ( slider bar Properties )
private bool drawFocusRectangle = true;
[Description("Set whether to draw focus rectangle")]
[Category("ColorSlider")]
[DefaultValue(true)]
public bool DrawFocusRectangle
{
get { return drawFocusRectangle; }
set
{
drawFocusRectangle = value;
Invalidate();
}
}
private bool drawSemitransparentThumb = true;
[Description("Set whether to draw semitransparent thumb")]
[Category("ColorSlider")]
[DefaultValue(true)]
public bool DrawSemitransparentThumb
{
get { return drawSemitransparentThumb; }
set
{
drawSemitransparentThumb = value;
Invalidate();
}
}
private bool mouseEffects = true;
[Description("Set whether mouse entry and exit actions have impact on how control look")]
[Category("ColorSlider")]
[DefaultValue(true)]
public bool MouseEffects
{
get { return mouseEffects; }
set
{
mouseEffects = value;
Invalidate();
}
}
private int mouseWheelBarPartitions = 10;
[Description("Set to how many parts is bar divided when using mouse wheel")]
[Category("ColorSlider")]
[DefaultValue(10)]
public int MouseWheelBarPartitions
{
get { return mouseWheelBarPartitions; }
set
{
if (value > 0)
mouseWheelBarPartitions = value;
else throw new ArgumentOutOfRangeException("MouseWheelBarPartitions has to be greather than zero");
}
}
private Color thumbOuterColor = Color.White;
[Description("Set Slider thumb outer color")]
[Category("ColorSlider")]
[DefaultValue(typeof(Color), "White")]
public Color ThumbOuterColor
{
get { return thumbOuterColor; }
set
{
thumbOuterColor = value;
Invalidate();
}
}
private Color thumbInnerColor = Color.Gainsboro;
[Description("Set Slider thumb inner color")]
[Category("ColorSlider")]
[DefaultValue(typeof(Color), "Gainsboro")]
public Color ThumbInnerColor
{
get { return thumbInnerColor; }
set
{
thumbInnerColor = value;
Invalidate();
}
}
private Color thumbPenColor = Color.Silver;
[Description("Set Slider thumb pen color")]
[Category("ColorSlider")]
[DefaultValue(typeof(Color), "Silver")]
public Color ThumbPenColor
{
get { return thumbPenColor; }
set
{
thumbPenColor = value;
Invalidate();
}
}
private Color barOuterColor = Color.SkyBlue;
[Description("Set Slider bar outer color")]
[Category("ColorSlider")]
[DefaultValue(typeof(Color), "SkyBlue")]
public Color BarOuterColor
{
get { return barOuterColor; }
set
{
barOuterColor = value;
Invalidate();
}
}
private Color barInnerColor = Color.DarkSlateBlue;
[Description("Set Slider bar inner color")]
[Category("ColorSlider")]
[DefaultValue(typeof(Color), "DarkSlateBlue")]
public Color BarInnerColor
{
get { return barInnerColor; }
set
{
barInnerColor = value;
Invalidate();
}
}
private Color barPenColor = Color.Gainsboro;
[Description("Set Slider bar pen color")]
[Category("ColorSlider")]
[DefaultValue(typeof(Color), "Gainsboro")]
public Color BarPenColor
{
get { return barPenColor; }
set
{
barPenColor = value;
Invalidate();
}
}
private Color elapsedOuterColor = Color.DarkGreen;
[Description("Set Slider's elapsed part outer color")]
[Category("ColorSlider")]
[DefaultValue(typeof(Color), "DarkGreen")]
public Color ElapsedOuterColor
{
get { return elapsedOuterColor; }
set
{
elapsedOuterColor = value;
Invalidate();
}
}
private Color elapsedInnerColor = Color.Chartreuse;
[Description("Set Slider's elapsed part inner color")]
[Category("ColorSlider")]
[DefaultValue(typeof(Color), "Chartreuse")]
public Color ElapsedInnerColor
{
get { return elapsedInnerColor; }
set
{
elapsedInnerColor = value;
Invalidate();
}
}
#endregion
#endregion
#region [ Color schemas ]
//define own color schemas
private Color[,] aColorSchema = new Color[,]
{
{
Color.White, Color.Gainsboro, Color.Silver, Color.SkyBlue, Color.DarkSlateBlue, Color.Gainsboro,
Color.DarkGreen, Color.Chartreuse
},
{
Color.White, Color.Gainsboro, Color.Silver, Color.Red, Color.DarkRed, Color.Gainsboro, Color.Coral,
Color.LightCoral
},
{
Color.White, Color.Gainsboro, Color.Silver, Color.GreenYellow, Color.Yellow, Color.Gold, Color.Orange,
Color.OrangeRed
},
{
Color.White, Color.Gainsboro, Color.Silver, Color.Red, Color.Crimson, Color.Gainsboro, Color.DarkViolet
, Color.Violet
}
};
public enum ColorSchemas
{
PerlBlueGreen,
PerlRedCoral,
PerlGold,
PerlRoyalColors
}
private ColorSchemas colorSchema = ColorSchemas.PerlBlueGreen;
[Description("Set Slider color schema. Has no effect when slider colors are changed manually after schema was applied.")]
[Category("ColorSlider")]
[DefaultValue(typeof(ColorSchemas), "PerlBlueGreen")]
public ColorSchemas ColorSchema
{
get { return colorSchema; }
set
{
colorSchema = value;
byte sn = (byte)value;
thumbOuterColor = aColorSchema[sn, 0];
thumbInnerColor = aColorSchema[sn, 1];
thumbPenColor = aColorSchema[sn, 2];
barOuterColor = aColorSchema[sn, 3];
barInnerColor = aColorSchema[sn, 4];
barPenColor = aColorSchema[sn, 5];
elapsedOuterColor = aColorSchema[sn, 6];
elapsedInnerColor = aColorSchema[sn, 7];
Invalidate();
}
}
#endregion
#region [ Constructors ]
private void InitializeComponent()
{
this.SuspendLayout();
this.Size = new System.Drawing.Size(200, 30);
this.ResumeLayout(false);
}
public wsSlider(int min, int max, int value)
{
InitializeComponent();
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer |
ControlStyles.ResizeRedraw | ControlStyles.Selectable |
ControlStyles.SupportsTransparentBackColor | ControlStyles.UserMouse |
ControlStyles.UserPaint, true);
BackColor = Color.Transparent;
Minimum = min;
Maximum = max;
trackerValue[act] = value;
for (int i = 0; i < 10; i++)
trackColor[i] = Color.Black;
}
public wsSlider() : this(0, 100, 50) { }
#endregion
#region [ Paint ]
protected override void OnPaint(PaintEventArgs e)
{
if (!Enabled)
{
Color[] desaturatedColors = DesaturateColors(thumbOuterColor, thumbInnerColor, thumbPenColor,
barOuterColor, barInnerColor, barPenColor,
elapsedOuterColor, elapsedInnerColor);
DrawColorSlider(e, desaturatedColors[0], desaturatedColors[1], desaturatedColors[2],
desaturatedColors[3],
desaturatedColors[4], desaturatedColors[5], desaturatedColors[6], desaturatedColors[7]);
}
else
{
if (mouseEffects && mouseInRegion)
{
Color[] lightenedColors = LightenColors(thumbOuterColor, thumbInnerColor, thumbPenColor,
barOuterColor, barInnerColor, barPenColor,
elapsedOuterColor, elapsedInnerColor);
DrawColorSlider(e, lightenedColors[0], lightenedColors[1], lightenedColors[2], lightenedColors[3],
lightenedColors[4], lightenedColors[5], lightenedColors[6], lightenedColors[7]);
}
else
{
DrawColorSlider(e, thumbOuterColor, thumbInnerColor, thumbPenColor,
barOuterColor, barInnerColor, barPenColor,
elapsedOuterColor, elapsedInnerColor);
}
}
}
Rectangle GetThumbRect(int nT)
{
Rectangle rt = new Rectangle();
if (barOrientation == Orientation.Horizontal)
{
int TrackX = (((trackerValue[nT] - barMinimum) * (ClientRectangle.Width - thumbSize)) / (barMaximum - barMinimum));
rt = new Rectangle(TrackX, 1, thumbSize - 1, ClientRectangle.Height - 3);
}
else
{
int TrackY = (((trackerValue[nT] - barMinimum) * (ClientRectangle.Height - thumbSize)) / (barMaximum - barMinimum));
rt = new Rectangle(1, TrackY, ClientRectangle.Width - 3, thumbSize - 1);
}
return rt;
}
GraphicsPath GetThumbPath(Rectangle rt)
{
GraphicsPath thumbPath;
if (thumbCustomShape == null)
thumbPath = CreateRoundRectPath(rt, thumbRoundRectSize);
else
{
thumbPath = thumbCustomShape;
Matrix m = new Matrix();
m.Translate(rt.Left - thumbPath.GetBounds().Left, rt.Top - thumbPath.GetBounds().Top);
thumbPath.Transform(m);
}
return thumbPath;
}
private void DrawColorSlider(PaintEventArgs e, Color thumbOuterColorPaint, Color thumbInnerColorPaint,
Color thumbPenColorPaint, Color barOuterColorPaint, Color barInnerColorPaint,
Color barPenColorPaint, Color elapsedOuterColorPaint, Color elapsedInnerColorPaint)
{
try
{
//set up thumbRect aproprietly
thumbRect = GetThumbRect(act);
#region ( adjust drawing rects )
barRect = ClientRectangle;
thumbHalfRect = thumbRect;
LinearGradientMode gradientOrientation;
if (barOrientation == Orientation.Horizontal)
{
barRect.Inflate(-1, -barRect.Height / 3);
barHalfRect = barRect;
barHalfRect.Height /= 2;
gradientOrientation = LinearGradientMode.Vertical;
thumbHalfRect.Height /= 2;
elapsedRect = barRect;
elapsedRect.Width = thumbRect.Left + thumbSize / 2;
}
else
{
barRect.Inflate(-barRect.Width / 3, -1);
barHalfRect = barRect;
barHalfRect.Width /= 2;
gradientOrientation = LinearGradientMode.Horizontal;
thumbHalfRect.Width /= 2;
elapsedRect = barRect;
elapsedRect.Height = thumbRect.Top + thumbSize / 2;
}
#endregion
//get thumb shape path
GraphicsPath thumbPath = GetThumbPath(thumbRect);
#region ( draw bar )
using (LinearGradientBrush lgbBar = new LinearGradientBrush(barHalfRect, barOuterColorPaint, barInnerColorPaint, gradientOrientation))
{
lgbBar.WrapMode = WrapMode.TileFlipXY;
e.Graphics.FillRectangle(lgbBar, barRect);
//draw elapsed bar
using (LinearGradientBrush lgbElapsed = new LinearGradientBrush(barHalfRect, elapsedOuterColorPaint, elapsedInnerColorPaint, gradientOrientation))
{
lgbElapsed.WrapMode = WrapMode.TileFlipXY;
if (Capture && drawSemitransparentThumb)
{
Region elapsedReg = new Region(elapsedRect);
elapsedReg.Exclude(thumbPath);
e.Graphics.FillRegion(lgbElapsed, elapsedReg);
}
else
e.Graphics.FillRectangle(lgbElapsed, elapsedRect);
}
//draw bar band
using (Pen barPen = new Pen(barPenColorPaint, 0.5f))
{
e.Graphics.DrawRectangle(barPen, barRect);
}
}
#endregion
#region ( draw thumb )
Color newthumbOuterColorPaint = thumbOuterColorPaint, newthumbInnerColorPaint = thumbInnerColorPaint;
if (Capture && drawSemitransparentThumb)
{
newthumbOuterColorPaint = Color.FromArgb(175, thumbOuterColorPaint);
newthumbInnerColorPaint = Color.FromArgb(175, thumbInnerColorPaint);
}
using (LinearGradientBrush lgbThumb = new LinearGradientBrush(thumbHalfRect, newthumbOuterColorPaint, newthumbInnerColorPaint, gradientOrientation))
{
lgbThumb.WrapMode = WrapMode.TileFlipXY;
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
for (int i = 0; i < 10; i++)
{
if (trackEnable[i])
{
Rectangle r = GetThumbRect(i);
thumbPath = GetThumbPath(r);
e.Graphics.FillPath(lgbThumb, thumbPath);
Color newThumbPenColor = thumbPenColorPaint;
if (mouseEffects && (Capture || mouseInThumbRegion))
newThumbPenColor = ControlPaint.Dark(newThumbPenColor);
using (Pen thumbPen = new Pen(newThumbPenColor))
{
e.Graphics.DrawPath(thumbPen, thumbPath);
}
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
sf.FormatFlags = StringFormatFlags.NoWrap;
e.Graphics.DrawString((i + 1).ToString(), this.Font, new SolidBrush(trackColor[i]), r, sf);
}
}
}
#endregion
#region ( draw focusing rectangle )
if (Focused & drawFocusRectangle)
using (Pen p = new Pen(Color.FromArgb(200, barPenColorPaint)))
{
p.DashStyle = DashStyle.Dot;
Rectangle r = ClientRectangle;
r.Width -= 2;
r.Height--;
r.X++;
//ControlPaint.DrawFocusRectangle(e.Graphics, r);
using (GraphicsPath gpBorder = CreateRoundRectPath(r, borderRoundRectSize))
{
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.DrawPath(p, gpBorder);
}
}
#endregion
}
catch (Exception Err)
{
Console.WriteLine("DrawBackGround Error in " + Name + ":" + Err.Message);
}
finally
{
}
}
#endregion
#region [ Overided events ]
#region [ Mouse Event ]
private bool mouseInRegion = false;
protected override void OnEnabledChanged(EventArgs e)
{
base.OnEnabledChanged(e);
Invalidate();
}
protected override void OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
mouseInRegion = true;
Invalidate();
}
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
mouseInRegion = false;
mouseInThumbRegion = false;
Invalidate();
}
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
if (e.Button == MouseButtons.Left)
{
Capture = true;
if (Scroll != null) Scroll(this, new ScrollEventArgs(ScrollEventType.ThumbTrack, trackerValue[act]));
if (ValueChanged != null) ValueChanged(this, new EventArgs());
OnMouseMove(e);
}
}
private bool mouseInThumbRegion = false;
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
mouseInThumbRegion = IsPointInRect(e.Location, thumbRect);
if (Capture & e.Button == MouseButtons.Left)
{
ScrollEventType set = ScrollEventType.ThumbPosition;
Point pt = e.Location;
int p = barOrientation == Orientation.Horizontal ? pt.X : pt.Y;
int margin = thumbSize >> 1;
p -= margin;
float coef = (float)(barMaximum - barMinimum) /
(float)
((barOrientation == Orientation.Horizontal ? ClientSize.Width : ClientSize.Height) -
2 * margin);
trackerValue[act] = (int)(p * coef + barMinimum);
if (trackerValue[act] <= barMinimum)
{
trackerValue[act] = barMinimum;
set = ScrollEventType.First;
}
else if (trackerValue[act] >= barMaximum)
{
trackerValue[act] = barMaximum;
set = ScrollEventType.Last;
}
if (Scroll != null) Scroll(this, new ScrollEventArgs(set, trackerValue[act]));
if (ValueChanged != null) ValueChanged(this, new EventArgs());
}
Invalidate();
}
protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
Capture = false;
mouseInThumbRegion = IsPointInRect(e.Location, thumbRect);
if (Scroll != null) Scroll(this, new ScrollEventArgs(ScrollEventType.EndScroll, trackerValue[act]));
if (ValueChanged != null) ValueChanged(this, new EventArgs());
Invalidate();
}
/*
protected override void OnMouseWheel(MouseEventArgs e)
{
base.OnMouseWheel(e);
int v = e.Delta / 120 * (barMaximum - barMinimum) / mouseWheelBarPartitions;
SetProperValue(trackerValue[act] + v);
}*/
#endregion
#region [ Focus ]
protected override void OnGotFocus(EventArgs e)
{
base.OnGotFocus(e);
Invalidate();
}
protected override void OnLostFocus(EventArgs e)
{
base.OnLostFocus(e);
Invalidate();
}
#endregion
#region [ key Press ]
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyUp(e);
switch (e.KeyCode)
{
case Keys.Down:
case Keys.Left:
SetProperValue(trackerValue[act] - (int)smallChange);
if (Scroll != null) Scroll(this, new ScrollEventArgs(ScrollEventType.SmallDecrement, trackerValue[act]));
if (ValueChanged != null) ValueChanged(this, new EventArgs());
break;
case Keys.Up:
case Keys.Right:
SetProperValue(trackerValue[act] + (int)smallChange);
if (Scroll != null) Scroll(this, new ScrollEventArgs(ScrollEventType.SmallIncrement, trackerValue[act]));
if (ValueChanged != null) ValueChanged(this, new EventArgs());
break;
case Keys.Home:
trackerValue[act] = barMinimum;
break;
case Keys.End:
trackerValue[act] = barMaximum;
break;
case Keys.PageDown:
SetProperValue(trackerValue[act] - (int)largeChange);
if (Scroll != null) Scroll(this, new ScrollEventArgs(ScrollEventType.LargeDecrement, trackerValue[act]));
break;
case Keys.PageUp:
SetProperValue(trackerValue[act] + (int)largeChange);
if (Scroll != null) Scroll(this, new ScrollEventArgs(ScrollEventType.LargeIncrement, trackerValue[act]));
break;
}
if (Scroll != null && trackerValue[act] == barMinimum) Scroll(this, new ScrollEventArgs(ScrollEventType.First, trackerValue[act]));
if (Scroll != null && trackerValue[act] == barMaximum) Scroll(this, new ScrollEventArgs(ScrollEventType.Last, trackerValue[act]));
Point pt = PointToClient(Cursor.Position);
OnMouseMove(new MouseEventArgs(MouseButtons.None, 0, pt.X, pt.Y, 0));
}
protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == Keys.Tab | ModifierKeys == Keys.Shift)
return base.ProcessDialogKey(keyData);
else
{
OnKeyDown(new KeyEventArgs(keyData));
return true;
}
}
#endregion
#endregion
#region [ Support routines ]
public static GraphicsPath CreateRoundRectPath(Rectangle rect, Size size)
{
GraphicsPath gp = new GraphicsPath();
gp.AddLine(rect.Left + size.Width / 2, rect.Top, rect.Right - size.Width / 2, rect.Top);
gp.AddArc(rect.Right - size.Width, rect.Top, size.Width, size.Height, 270, 90);
gp.AddLine(rect.Right, rect.Top + size.Height / 2, rect.Right, rect.Bottom - size.Width / 2);
gp.AddArc(rect.Right - size.Width, rect.Bottom - size.Height, size.Width, size.Height, 0, 90);
gp.AddLine(rect.Right - size.Width / 2, rect.Bottom, rect.Left + size.Width / 2, rect.Bottom);
gp.AddArc(rect.Left, rect.Bottom - size.Height, size.Width, size.Height, 90, 90);
gp.AddLine(rect.Left, rect.Bottom - size.Height / 2, rect.Left, rect.Top + size.Height / 2);
gp.AddArc(rect.Left, rect.Top, size.Width, size.Height, 180, 90);
return gp;
}
public static Color[] DesaturateColors(params Color[] colorsToDesaturate)
{
Color[] colorsToReturn = new Color[colorsToDesaturate.Length];
for (int i = 0; i < colorsToDesaturate.Length; i++)
{
//use NTSC weighted avarage
int gray =
(int)(colorsToDesaturate[i].R * 0.3 + colorsToDesaturate[i].G * 0.6 + colorsToDesaturate[i].B * 0.1);
colorsToReturn[i] = Color.FromArgb(-0x010101 * (255 - gray) - 1);
}
return colorsToReturn;
}
public static Color[] LightenColors(params Color[] colorsToLighten)
{
Color[] colorsToReturn = new Color[colorsToLighten.Length];
for (int i = 0; i < colorsToLighten.Length; i++)
{
colorsToReturn[i] = ControlPaint.Light(colorsToLighten[i]);
}
return colorsToReturn;
}
private void SetProperValue(int val)
{
if (val < barMinimum) trackerValue[act] = barMinimum;
else if (val > barMaximum) trackerValue[act] = barMaximum;
else trackerValue[act] = val;
}
private static bool IsPointInRect(Point pt, Rectangle rect)
{
if (pt.X > rect.Left & pt.X < rect.Right & pt.Y > rect.Top & pt.Y < rect.Bottom)
return true;
else return false;
}
#endregion
}
}
相关推荐
网络安全等保2.0与密评合规操作指南:数据中心、云平台及业务系统落地实施与迎检材料准备
内容概要:本文档是一份针对网络安全等级保护(等保2.0)与商用密码应用安全性评估(密评)的落地操作手册,旨在为数据中心、云平台运营商及业务系统提供从定级、备案、建设整改到测评评估的全流程指导。内容涵盖等保与密评的法律依据、适用范围、实施流程、技术与管理要求、材料清单、责任分工、常见问题及整改建议,并针对三类对象分别列出专项落地要点和自查清单,确保合规工作可执行、可追溯。; 适合人群:适用于数据中心运维人员、云平台安全负责人、业务系统管理员、安全合规专员及参与等保与密评工作的项目负责人和技术人员。; 使用场景及目标:①指导单位开展等保定级备案与等级测评准备工作;②推动密评在关键系统中的落地实施,确保密码应用合规、正确、有效;③支持迎检材料整理、整改措施落实与持续合规运维。; 阅读建议:建议按照手册章节顺序逐步推进,结合附录自查清单与材料模板,联动技术、管理和运维团队协同执行,并定期对照更新,确保等保与密评工作闭环管理。
.NET下GDI+的一些常用应用(水印,文字,圆角处理)
在某些情况下希望处理一些图片,比如给图片添加一般文字:原图程序处理成给图片添加水印:原图程序处理成还有圆角效果:原图程序处理成注:(1)以下程序针对这个应用,也许这些对你没有用,但是基本的原理都差不多(2)以上图为测试用,应该不算侵犯肖像权吧程序界面:程序点击这里下载。 如果需要提高图片质量,把image.Save(sDstFilePath,ImageFormat.Jpeg);改成 Image...
【Web服务器运维】基于Nginx与Keepalived的高可用负载均衡系统部署:实现故障自动切换与虚拟IP管理
内容概要:本文详细介绍了如何通过Nginx与Keepalived实现高可用的负载均衡架构。首先讲解了Nginx的安装部署流程,包括依赖环境的准备、源码解压编译、启动及配置重载;接着介绍了Keepalived的安装步骤及其服务管理方式;重点在于通过配置Keepalived的主备节点(MASTER/BACKUP),结合VRRP协议和虚拟IP(VIP)实现故障自动切换,并通过自定义脚本nginx_check.sh实时检测Nginx运行状态,确保服务高可用;最后补充了在云环境中因组播限制导致心跳不稳定时,应改用单播(unicast)方式进行通信的解决方案。; 适合人群:具备Linux系统操作基础、熟悉网络基础知识,从事运维、DevOps或Web服务部署的技术人员,尤其是工作1-3年的工程师。; 使用场景及目标:①搭建高可用的Web负载均衡系统,避免单点故障;②掌握Nginx与Keepalived协同工作的原理与实战配置方法;③应用于生产环境中提升服务稳定性与容灾能力。; 阅读建议:学习时应结合实验环境动手操作,重点关注keepalived.conf配置差异与nginx_check.sh脚本逻辑,理解VRRP机制及单播替代组播的实际应用场景,注意根据实际网络环境调整IP与网卡参数。
Flutter (四) 基础 Widgets、Material Components Widget 全面介绍
基础 Widgets 重要概念 一切皆组件。Flutter 所有的元素都是由组件组成。比如一个布局元素、一个动画、一个装饰效果等。 容器 Container 容器组件 Container 包含一个子 widget ,自身具备 alignment 、padding 等属性 ,方便布局过程中摆放 child 。 属性 属性名 类型 说明 key Key 控制一个小部件如何替换树中的另一个...
三电平Buck直流变换器双闭环、单闭环、开环仿真【附参考文献】(Simulink仿真实现)
内容概要:本文档系统介绍了三电平Buck直流变换器在Simulink环境下的开环、单闭环与双闭环控制系统的建模仿真方法,涵盖系统建模、控制策略设计及动态性能对比分析。通过构建不同控制结构,深入探讨电压调节精度、系统响应速度、抗干扰能力及稳定性差异,重点剖析双闭环控制中电压外环与电流内环的协同作用机制,揭示其在抑制输出纹波、提升负载适应性方面的优势,帮助读者掌握多电平DC-DC变换器的核心控制原理与工程实现技术;文档还提供了详实的仿真参数设置与参考文献,便于理论验证与实践复现。; 适合人群:电力电子、自动化、电气工程及其相关专业的高校本科生、研究生、科研人员,以及从事电源系统、新能源变换器开发的工程技术人员。; 使用场景及目标:①作为高校电力电子课程的教学案例,辅助学生理解Buck变换器多层次控制策略的设计思路与性能差异;②为科研项目中高效直流变换系统的仿真研究提供可复用的技术模板;③指导工业界在高精度电源设计中优化控制器参数,提升系统动态响应与稳定性。; 阅读建议:建议结合Simulink仿真模型同步操作,对照文档逐步搭建各控制结构,重点观察不同闭环配置下输出电压的瞬态与稳态表现,深入理解PI参数整定、环路耦合影响及系统频域特性的关联性,从而全面提升对电力电子系统控制设计的综合把握能力。
国央企创新负责人如何实现科技成果的全流程数字化管理?.docx
科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。
政府科技管理者如何实现科技成果转化资源的精准匹配与高效调度.docx
科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。
高校技术转移办公室人员在推介成果转化时,如何实现技术成果的精准呈现?.docx
科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。
三层交换机第一次作业.docx
三层交换机第一次作业.docx
单相PWM整流器基于直流电流控制+虚拟dq两种闭环控制仿真【2个仿真+参考资料】
内容概要:本文系统介绍了单相PWM整流器的两种主流闭环控制策略——基于直流电流控制和虚拟dq坐标系控制,配套提供了两个完整的Simulink仿真模型及相关参考资料。资源聚焦于控制系统的设计原理与实现细节,深入剖析电压外环与电流内环构成的双闭环结构,旨在实现高功率因数运行、直流侧电压稳定以及优异的动态响应性能。通过对两种控制方法的建模、仿真与对比分析,帮助使用者全面理解其在控制精度、抗扰动能力、系统稳定性及工程实用性等方面的差异与适用场景。; 适合人群:电气工程、自动化、电力电子与电力传动等相关专业的本科生、研究生,以及从事新能源发电、电力变换系统、电能质量治理等领域研发工作的工程技术人员。; 使用场景及目标:①学习和掌握单相PWM整流器的基本工作原理、数学建模与主电路设计方法;②深入理解直流电流控制与虚拟dq控制的核心思想、实现流程及其在实际系统中的优缺点与应用场景差异;③为毕业设计、课程设计、科研课题或工业级产品开发提供可靠的仿真平台和技术参考依据。; 阅读建议:建议结合Simulink仿真模型与参考资料进行同步学习,动手调整控制器参数并观察系统动态响应变化,以深化对控制策略的理解;在掌握单相系统基础上,可进一步拓展学习三相PWM整流器、图腾柱PFC、Vienna整流器等先进拓扑及其控制技术,逐步构建完整的电力电子变换器控制知识体系。
产业园区运营负责人如何实现科技资源的高效配置与联动?.docx
科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。
单相boost功率因数校正 PFC电路仿真(Simulink仿真实现)
内容概要:本文档围绕“单相Boost功率因数校正(PFC)电路仿真”的Simulink实现展开,系统阐述了基于双闭环控制的单相Boost PFC电路的建模与仿真全过程。内容涵盖电路拓扑结构设计、工作原理分析、关键控制策略(如平均电流控制、PI调节、电压外环与电流内环协同控制、前馈补偿等)的实现机制,并通过Simulink平台构建完整仿真模型,验证输入电流正弦化、单位功率因数实现及输出电压稳定等性能指标。文档还详述了控制参数的设计方法、系统动态响应评估以及仿真结果的分析流程,帮助读者深入掌握PFC技术的核心理论与工程应用细节。; 适合人群:具备电力电子、自动控制理论及电路分析基础,正在从事开关电源、新能源变换系统、电能质量治理等相关方向研究的本科高年级学生、研究生及电气工程领域的研发工程师。; 使用场景及目标:① 深入理解单相Boost PFC电路的工作机理与双闭环控制架构;② 掌握在Simulink中搭建电力电子变换器控制系统的方法,提升仿真建模与调试能力;③ 为毕业课题、科研项目或工业级PFC产品开发提供可复用的技术方案与仿真基础。; 阅读建议:建议结合Simulink软件动手实践,逐步构建主电路与控制模块,重点理解电流内环的跟踪性能与电压外环的稳定性设计,关注PI控制器参数整定与系统抗扰动能力的关系,同时可延伸学习图腾柱、交错并联等先进PFC拓扑结构,以拓宽技术视野。
产业园区在推动科技成果转化时,如何精准匹配企业与技术供给方?.docx
科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。
LLC谐振变换器开环+闭环软启动仿真设计(Simulink仿真实现)
内容概要:本文档聚焦于LLC谐振变换器的开环与闭环软启动仿真设计,基于Simulink平台实现了半桥和全桥LLC拓扑结构的建模与仿真,深入探讨了软开关技术、变频控制、移相混合控制等多种先进控制策略的应用。资源包包含完整的仿真模型、详细的设计报告、参数计算书及说明文档,系统展示了LLC变换器在启动过程中电压与电流波形的动态响应特性,重点优化了系统稳定性与瞬态性能,帮助用户深入理解其闭环调节机制与工程实现方法。同时,文档整合了大量电力电子与控制系统相关的仿真资源,构建了一个涵盖PFC、DC-DC变换器、逆变器、储能系统等在内的综合性技术资料库,适用于科研、教学与产品开发多个层面。; 适合人群:具备电力电子、自动控制理论基础,从事开关电源设计、新能源变换系统研发、电力电子仿真分析等相关工作的研究生、工程师及科研人员。; 使用场景及目标:①深入掌握LLC谐振变换器的工作原理及其软启动控制策略;②学习在Simulink中构建高精度电力电子系统仿真模型的方法;③为毕业设计、科研课题或工业级电源产品的开发提供可复用的仿真架构与参数设计依据。; 阅读建议:建议结合所提供的仿真模型与技术文档同步实践,逐步调试开环启动与闭环控制参数,重点关注启动过程中的电压冲击、电流应力及谐振元件的动态行为,深入分析控制环路设计对系统稳定性和效率的影响,从而全面提升对LLC变换器系统级设计的理解与应用能力。
高校技术转移办公室人员如何提升技术成果的转化效率与市场对接成功率?.docx
科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。
三相三电平VIENNA整流器双闭环设计与中点电压均衡控制仿真(Simulink仿真实现)
内容概要:本文详细介绍了一套针对三相三电平VIENNA整流器的Simulink仿真设计方案,重点聚焦于电压电流双闭环控制系统与中点电压均衡控制策略的实现。通过构建双闭环控制架构(外环直流电压控制与内环电流控制),确保系统在动态负载变化下仍能维持稳定的直流母线电压和单位功率因数运行;同时引入基于SVPWM的空间矢量调制技术,并结合中点电位平衡控制算法,有效抑制三电平变换器特有的中点电压漂移问题,提升系统运行的对称性与可靠性。该仿真模型具有高度工程实用性,适用于新能源发电、电动汽车充电桩、工业电机驱动等高效率、高功率密度应用场景,为相关领域的科研与产品开发提供了完整的理论依据和技术验证平台。; 适合人群:电气工程、自动化、电力电子与电力传动等相关专业的高校研究生及科研人员,以及从事高端电源、新能源并网、电能质量治理等方向的技术研发工程师,尤其适合已掌握Simulink基本操作并希望深入理解三电平整流器控制机理的学习者。; 使用场景及目标:① 深入掌握三相三电平VIENNA整流器的工作原理及其数学建模方法;② 学习并实践双闭环控制器的设计流程与PI参数整定技巧;③ 理解中点电压不平衡的成因及其对系统性能的影响,掌握基于调制策略的主动均衡控制方法;④ 构建可用于学术研究或工程项目前期验证的高保真仿真平台,支撑后续硬件原型开发与控制算法优化。; 阅读建议:建议结合仿真模型与技术文档同步学习,重点关注坐标变换(abc/dq)、SVPWM模块实现、中点电位观测与反馈控制逻辑的设计细节,推荐通过逐步调试各子系统模块的方式加深理解;有条件者可进一步开展硬件在环(HIL)测试,以验证控制策略的实际可行性与鲁棒性。
一个免费的激光打标软件的配套硬件说明
激光打标软件配套硬件说明
国央企创新负责人在推动内部技术成果产业化落地时,如何实现技术资源的高效配置与精准对接?.docx
科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。
291



被折叠的 条评论
为什么被折叠?



