Introduction
My first article was based on a class which only draws the Gradient progress line. I guess there was too much work to use it. My idea was to drag a new control to my form, set the properties to what I like, and everything should work.
This new Control replaces the old version and is ready to use, extended by the most important properties from PictureBox and Gradient Class. It uses a Thread based Timer Class to redraw itself. With this timer it is possible to draw the Gradient while you're doing hard work behind the scenes.
How to use it
and you're finished.
To use the gradient call Start
and Stop
Key Benefits
- MSDN styled Help File included, created with NDoc (great freeware).
- Easy to use, no great library is used, just copy the UserControl to your code and change Namespace.
- Easy customizable, every property can altered via Property ToolWindow.
- Compact design, black boxed in only one control.
- 100% C#, no API's used.
How it works
The User Control is based on a
PictureBox
in which
SizeMode
is set to
AutoSize
. The height property of
PictureBox
is extended by the
GradientHeight
Property. When you choose a Image the control resize itself to reflect changes made to the
Image
Property.
The Gradient is basically drawn with four LinearGradientBrush
and two SolidBrush
classes. mainRect
is the Rectangle
in which we have to draw. The Gradient will move from Position 0 to mainRect.Width
.
The problem is that the Gradient will move out on the right side, and at the same time it will move in at the left side. It seems like the Gradient would cycle and never leave the Rectangle
. Because of this we need four LinearGradientBrush
and not only two. We need also two SolidBrush
to fill the region which is not affected by the Gradient. These brushes are created with the two colors used for Gradient.
These Properties are important for drawing:
GradientHeight
height of Gradient.GradientSizeInProcent
Gradient size in % relative to the given width.Rectangle
Gradient rectangle ( GradientHeight included ).Color1
and Color2
used for LinearGradientBrush
.Step
Stepsize in Pixel.Speed
Timer tick in milliseconds.
With this Propertys we can figure out how the Gradient must be drawn. The GradientSizeInProcent
is evaluated like this:
decimal factor = (decimal) mainRect_.Width / 100;
GradientSize_ = (float) System.Math.Round( (decimal)
this.GradientSizeInProcent * factor);
Every time the timer ticks, the Position
will increased by Step
till current Position
+ Step
is greater than the given mainRect_.Width
. In this case Position
is set back to 0. The Gradient updates to reflect changes.
pos_ = pos_ + stepSize_;
if (pos_ > mainRect_.Width)
{
pos_ = 0;
}
PaintGardient();
Initalize needed
Rectangle
with
mainRect_
bool useRightBrush = false;
bool useLeftBrush = false;
RectangleF rectLeft = mainRect_;
RectangleF rectRight = mainRect_;
RectangleF rectRightFill = mainRect_;
RectangleF rectLeftFill = mainRect_;
RectangleF rectRightLeftEnd = mainRect_;
RectangleF rectRightRightEnd = mainRect_;
Get current position and evaluate
Rectangles
for each brush.
rectLeft.Width = gardientSize_;
rectLeft.X = pos_ - rectLeft.Width;
rectRight.X = mainRect_.X + pos_;
rectRight.Width = gardientSize_;
rectLeftFill.Width = pos_ - gardientSize_;
rectRightFill.X = pos_ + gardientSize_;
rectRightFill.Width = mainRect_.Width - (pos_ + gardientSize_);
if ((pos_ + gardientSize_) > mainRect_.Width)
{
rectRightRightEnd.X = - (mainRect_.Width - pos_);
rectRightRightEnd.Width = gardientSize_;
useRightBrush = true;
rectLeftFill.X = rectRightRightEnd.X + gardientSize_;
rectLeftFill.Width -= rectRightRightEnd.X + gardientSize_;
}
if (pos_ <= gardientSize_)
{
useLeftBrush = true;
rectRightLeftEnd.X = (mainRect_.Width - gardientSize_) + pos_;
rectRightLeftEnd.Width = gardientSize_;
rectRightFill.X = rectRight.X + gardientSize_;
rectRightFill.Width = rectRightLeftEnd.X - rectRightFill.X;
}
Get
LinearGradientBrush
based on evaluated
Rectangles
.
Brush brushLeft = new LinearGradientBrush(rectLeft,color1_, color2_,0,true);
Brush brushRight = new LinearGradientBrush(rectRight,color2_, color1_,0,true);
Brush brushLeft1 = new LinearGradientBrush(rectRightLeftEnd,color1_, color2_,0,true);
Brush brushRight1 = new LinearGradientBrush(rectRightRightEnd,color2_, color1_,0,true);
Last but not least draw current position of the Gradient.
graphics_.FillRectangle(new SolidBrush(color1_),rectLeftFill);
graphics_.FillRectangle(brushLeft,rectLeft);
graphics_.FillRectangle(brushRight,rectRight);
graphics_.FillRectangle(new SolidBrush(color1_),rectRightFill);
if (useRightBrush)
{
graphics_.FillRectangle(brushRight1,rectRightRightEnd);
}
if (useLeftBrush)
{
graphics_.FillRectangle(brushLeft1,rectRightLeftEnd);
}
Have phun with it...