I'm developing a timeline user control for video usage. here is a photo of my work:
here i have problem. when currentTime changes, I have to update the UI. but when i use this.Invalidate(); it refreshes the whole control. but i want to just update the pointer (the white line in gray background). becuase it cause the control blink over and over on very tiny time change. how to just update the pointer? here is my onPaint method
private void OnPaint(object sender, System.Windows.Forms.PaintEventArgs e)
{
int width = this.Width;
int height = this.Height;
int Floor = height - FloorDistance;
Pen SecPen = new Pen(SecColor);
Pen MinPen = new Pen(MinColor);
SolidBrush TimeLineBrush = new SolidBrush(Color.Gray);
StringFormat stringFormat = new StringFormat();
SolidBrush TimesolidBrush = new SolidBrush(TimeColor);
SolidBrush BackBrush = new SolidBrush(TimlineBackColor);
SolidBrush PointerBrush = new SolidBrush(PointerColor);
stringFormat.FormatFlags = StringFormatFlags.DirectionVertical;
switch (Zoom)
{
case ZoomLEvel.Quarter:
width = (int)Math.Ceiling((TotalDuration / 900)) * ThickDistance;
break;
case ZoomLEvel.Minute:
width = (int)Math.Ceiling((TotalDuration / 60)) * ThickDistance;
break;
case ZoomLEvel.Secound:
width = (int)Math.Ceiling(TotalDuration) * ThickDistance;
break;
case ZoomLEvel.MiliSecound:
width = (int)Math.Ceiling(TotalDuration * 10) * ThickDistance;
break;
}
width += 11;
this.Width = width;
e.Graphics.FillRectangle(TimeLineBrush, 0, Floor, width, 3);
e.Graphics.FillRectangle(BackBrush, 0, 0, width, height - FloorDistance);
int x = ThickDistance;
int step = 0;
while (x <= width - ThickDistance)
{
if (step % 5 == 0)
{
e.Graphics.DrawLine(MinPen, x, Floor, x, Floor - _MinHeight);
// print time
string time = "";
double totalSecounds = 0;
PointF pointF = new PointF(x - 8, Floor + 5);
switch (Zoom)
{
case ZoomLEvel.Quarter:
totalSecounds = step * 900;
break;
case ZoomLEvel.Minute:
totalSecounds = step * 60;
break;
case ZoomLEvel.Secound:
totalSecounds = step;
break;
case ZoomLEvel.MiliSecound:
totalSecounds = step / 10d;
break;
}
time = (new TimeSpan(0, 0, 0, (int)totalSecounds, (int)(step % 10) * 100)).ToString(@"hh\:mm\:ss\:fff");
e.Graphics.DrawString(time, this.Font, TimesolidBrush, pointF, stringFormat);
}
else
e.Graphics.DrawLine(SecPen, x, Floor, x, Floor - _SecHeight);
x += ThickDistance;
step++;
}
int PointerTime = 0;//(int)Math.Floor(CurrentTime);
int pointerX = 0;
switch (Zoom)
{
case ZoomLEvel.Quarter:
PointerTime = (int)Math.Floor(CurrentTime / 900);
pointerX = PointerTime * ThickDistance;
break;
case ZoomLEvel.Minute:
PointerTime = (int)Math.Floor(CurrentTime / 60);
pointerX = PointerTime * ThickDistance;
break;
case ZoomLEvel.Secound:
PointerTime = (int)Math.Floor(CurrentTime);
pointerX = PointerTime * ThickDistance;
break;
case ZoomLEvel.MiliSecound:
PointerTime = (int)Math.Floor(CurrentTime * 10);
pointerX = PointerTime * ThickDistance;
break;
}
pointerX += 5;
e.Graphics.FillRectangle(PointerBrush, pointerX, 0, 2, height - FloorDistance);
}