C#⾃定义时间进度条
这篇⽂章对我帮助极⼤,我模仿着写了两遍⼤概摸清楚了⾃定义控件的流程。感谢⼤佬leslie_xin
样式
最开始
进度条有更改
根据开始时间和结束时间时间刻度间隔有更改
设置项
正⽂
⾸先,我模仿过leslie_xin,写过⼀个进度条,⽤于播放视频,但是没有刻度,现在没有刻度不⾏,所以要搞⼀个刻度,计划使⽤GDI+
然后,发现/lesliexin/p/这个控件⾥的长、宽不能修改,不然得⾃⼰再计算细节性得问题,就打算继承UrControl,把leslie_xin的进度条拖放进来
```UrControl```就把他当成正常窗⼝写,改写啥就写啥
正经脸
⾸先,能够满⾜⾃定以的进度条样式吧,⽐如前景⾊、背景⾊、进度的颜⾊,所以有了
privateColor_BarBackColor=gb(128,255,128);
[Category("TimeTrackBarControl"),Description("进度条背景⾊")]
publicColorBarBackColor
{
get
{
kColor;
}
t
{
_BarBackColor=value;
kColor=_BarBackColor;
Invalidate();
}
}
privateColor_BarSliderColor=gb(64,128,64);
[Category("TimeTrackBarControl"),Description("进度条滑块颜⾊rn有值部分的颜⾊")]
publicColorBarSliderColor
{
get
{
Color;
}
t
{
_BarSliderColor=value;
Color=_BarSliderColor;
Invalidate();
}
}
然后因为要显⽰时间、开始时间、结束时间,所以⼜有了
privateDateTime_StartTime=rs(-1);
[Category("TimeTrackBarControl"),Description("开始时间")]
publicDateTimeStartTime
{
get
{
return_StartTime;
}
t
{
_StartTime=value;
//if(_StartTime>_EndTime)_StartTime=_utes(-1);
_BarMaximum=(_EndTime-_StartTime).();
m=_BarMaximum;
m=0;
Invalidate();
}
}
privateDateTime_EndTime=;
[Category("TimeTrackBarControl"),Description("结束时间")]
publicDateTimeEndTime
{
get
{
return_EndTime;
}
t
{
_EndTime=value;
//if(_EndTime<_StartTime)_EndTime=_utes(1);
_BarMaximum=(_EndTime-_StartTime).();
m=_BarMaximum;
m=0;
Invalidate();
}
}
再次因为要纪录进度条的值、最⼤值、最⼩值为0,记个der~,(我也不知道为啥会有这样值,脑⼦可能有它⾃⼰的想法)所以还有
privateint_BarMaximum=0;
[Category("TimeTrackBarControl"),Description("最⼤值rn默认:0,由开始时间和结束时间决定(只读)")]
publicintBarMaximum
{
get
{
return_BarMaximum;
}
}
privateint_BarCurValue=0;
[Category("TimeTrackBarControl"),Description("当前值")]
publicintBarCurValue
{
get
{
_BarCurValue=ue;
return_BarCurValue;
}
t
{
_BarCurValue=value;
if(_BarCurValue<0)_BarCurValue=0;
if(_BarCurValue>_BarMaximum)_BarCurValue=_BarMaximum;
ue=_BarCurValue;
BarCurValueChanged?.Invoke(this,newCurValueEventArgs(_BarCurValue));
}
}
你这个时间刻度总得有颜⾊吧,总不能是皇帝的时间刻度,进度条的值对应的时间label也得有样式吧,皇帝也没有label啊,所以双有了
privateColor_TimeScaleColor=gb(210,210,210);
[Category("TimeTrackBarControl"),Description("时间刻度的颜⾊")]
publicColorTimeScaleColor
{
get
{
return_TimeScaleColor;
}
t
{
_TimeScaleColor=value;
Invalidate();
}
}
privateint_ScaleInterval=1200;
[Category("TimeTrackBarControl"),Description("时间刻度之间相隔秒数,⼩于零表⽰⾃适应rn单位:秒")]
publicintScaleInterval
{
get
{
return_ScaleInterval;
}
t
{
_ScaleInterval=value;
//if(_ScaleInterval<=0)
//{
//_ScaleInterval=1800;
//}
Invalidate();
}
}
privateint_RealScaleInterval=1200;
[Category("TimeTrackBarControl"),Description("实际相隔的秒数(为了显⽰⾃适应时真实的间隔时间)rn单位:秒")]
publicintRealScaleInterval
{
get
{
_RealScaleInterval=_ScaleInterval>0?_ScaleInterval:_RealScaleInterval;
return_RealScaleInterval;
}
}
privateColor_TimeLabelBackColor=gb(255,192,192);
[Category("TimeTrackBarControl"),Description("时间label背景⾊")]
publicColorTimeLabelBackColor
{
get
{
return_TimeLabelBackColor;
}
t
{
_TimeLabelBackColor=value;
Invalidate();
}
}
privateColor_TimeLabelForeColor=gb(192,255,192);
[Category("TimeTrackBarControl"),Description("时间label前景⾊")]
publicColorTimeLabelForeColor
{
get
{
return_TimeLabelForeColor;
}
t
{
_TimeLabelForeColor=value;
Invalidate();
}
}
最后你这个时间刻度总得能够直接跳到某个时间点吧,所以叒有
publicvoidSeekByTime(DateTimetime)
{
BarCurValue=(time-StartTime).();
}
你搞了那么多样式,总得有⼈去画吧,所以叕有了
protectedoverridevoidOnPaint(PaintEventArg)
{
t(e);
}
时间刻度呢?总得去⽣成吧,所以我们要计算⼀下,每个刻度之间间隔多少秒钟,毕竟进度条的最⼩值为零,最⼤值为开始时间和最⼩时间间隔的秒数。
所以:1、计算间隔
2、计算时间刻度的坐标
3、画出来
///
///微软雅⿊regular10F23:56分约占38个像素,现定为45个像素为最⼩值,时间刻度:60秒为最⼩值
///
///
privateintSelfAdaption()
{
floatradio=45*1.0f/;//45个像素占进度条总长的⽐例
doubleinterval=(_EndTime-_StartTime).TotalSeconds*radio;//这个⽐例下,占多长的时间
if(interval<=60)
{
interval=60;
}
elif(interval>60&&interval<=300)
{
interval=300;
}
elif(interval>300&&interval<=600)
{
interval=600;
}
elif(interval>600&&interval<=1200)
{
interval=1200;
}
elif(interval>1200&&interval<=1800)
{
interval=1800;
}
elif(interval>1800&&interval<=3600)
{
interval=3600;
}
32(interval);
}
///
///要划线的坐标
///
///
///
privateList
{
DateTimetime=_StartTime;
if(_ScaleInterval<0)
{
_RealScaleInterval=SelfAdaption();
}
el
{
_RealScaleInterval=_ScaleInterval;
}
List
TimeScaleLocationstart_scale=newTimeScaleLocation(on.X,on.Y+/2,_StartTime);
(start_scale);
while(onds(_RealScaleInterval)<_EndTime)
{
time=onds(_RealScaleInterval);
intval=(time-_StartTime).();
floatradio=val*1.0f/_BarMaximum;
intx=on.X+32(*radio);
inty=on.Y;
TimeScaleLocationscale=newTimeScaleLocation(x,y,time);
(scale);
}
intend_x=on.X+;
intend_y=on.Y+/2;
TimeScaleLocationend_scale=newTimeScaleLocation(end_x,end_y,_EndTime);
(end_scale);
returnscales;
}
//完全体的OnPaint⽅法
protectedoverridevoidOnPaint(PaintEventArg)
{
t(e);
ChangeStyle();
ingMode=ality;
Penpen=newPen(_TimeScaleColor,1);
Brushbrush=newSolidBrush(_TimeScaleColor);
Fontfont=newFont("微软雅⿊",10,r,,(byte)134);
List
for(inti=0;i<;i++)
{
TimeScaleLocationitem=scales[i];
intlength=15;
if(_RealScaleInterval*i%3600==0)
{
length=length+*1;
}
if(i==0||i==-1)
{
length=(int)(length+*1.5);
}
if(i==0)
{
item.x-=1;
}
ne(pen,item.x,item.y,item.x,item.y-length);
ring(ng("HH:mm"),font,brush,newPoint(item.x-19,*2));
}
}
//设置label样式,onpaint⽅法调⽤
privatevoidChangeStyle()
{
lor=_TimeLabelBackColor;
lor=_TimeLabelForeColor;
}
是不是发现有个TimeScaleLocation不知道是啥?
usingSystem;
ls
{
///
///时间刻度信息
///
publicclassTimeScaleLocation
{
///
///time对应在进度条上的点的x坐标
///
publicintx{get;t;}
///
///time对应在进度条上的点的y坐标
///
publicinty{get;t;}
///
///time时间点
///
publicDateTimetime{get;t;}
publicTimeScaleLocation(intx,inty,DateTimetime)
{
this.x=x;
this.y=y;
=time;
}
}
}
哦,我亲爱的⽼伙计,我好像忘记了把事件加上来了,我今天得罚我⾃⼰吃三⼤碗饭,治治我这个不长记性的脑⼦。所以这个事件我借⽤那个⼤佬的
#region事件,
publicdelegatevoidCurValueChangedEventHandler(objectnder,CurValueEventArg);
///
///值发⽣改变时引发的事件
///
publiceventCurValueChangedEventHandlerBarCurValueChanged;
#endregion
收获
1、markdown不会使,排版全⽤
#我太难了
2、在UrControl中,如果不是其他控件的事件,那么将事件替换为OnXXX(),例如:Click替换为OnClick(),这样好像⽐较快,尤其是⿏标事件
3、注意循环调⽤,⽐如修改BarCurValue时修改了还加了事件,然后⼜在ar的valueChanged事件中修改了BarCurValue,然后就会发现vs好像累了,它不想理你了,怎么挑逗都不起
作⽤了outofstrack?还是其他的啥玩意。就是这两个发⽣了循环调⽤
4、这个版本有点⼩问题,修改办法放在收获中
其他,未知,忘记了,等我记起了再补充。退朝~
完整内容
usingSystem;
c;
entModel;
g;
g2D;
;
ls
{
[DefaultEvent("CurValueChanged")]
publicpartialclassTimeTrackBarControl:UrControl
{
publicTimeTrackBarControl()
{
InitializeComponent();
}
#region事件
publicdelegatevoidCurValueChangedEventHandler(objectnder,CurValueEventArg);
///
///值发⽣改变时引发的事件
///
publiceventCurValueChangedEventHandlerBarCurValueChanged;
#endregion
privateColor_BarBackColor=gb(128,255,128);
[Category("TimeTrackBarControl"),Description("进度条背景⾊")]
publicColorBarBackColor
{
get
{
kColor;
}
t
{
_BarBackColor=value;
kColor=_BarBackColor;
Invalidate();
}
}
privateColor_BarSliderColor=gb(64,128,64);
[Category("TimeTrackBarControl"),Description("进度条滑块颜⾊rn有值部分的颜⾊")]
publicColorBarSliderColor
{
get
{
Color;
}
t
{
_BarSliderColor=value;
Color=_BarSliderColor;
Invalidate();
}
}
privateDateTime_StartTime=rs(-1);
[Category("TimeTrackBarControl"),Description("开始时间")]
publicDateTimeStartTime
{
get
{
return_StartTime;
}
t
{
_StartTime=value;
//if(_StartTime>_EndTime)_StartTime=_utes(-1);
_BarMaximum=(_EndTime-_StartTime).();
m=_BarMaximum;
m=0;
Invalidate();
}
}
privateDateTime_EndTime=;
[Category("TimeTrackBarControl"),Description("结束时间")]
publicDateTimeEndTime
{
get
{
return_EndTime;
}
t
{
_EndTime=value;
//if(_EndTime<_StartTime)_EndTime=_utes(1);
_BarMaximum=(_EndTime-_StartTime).();
m=_BarMaximum;
m=0;
Invalidate();
}
}
privateint_BarMaximum=0;
[Category("TimeTrackBarControl"),Description("最⼤值rn默认:0,由开始时间和结束时间决定(只读)")]
publicintBarMaximum
{
get
{
return_BarMaximum;
}
}
privateint_BarCurValue=0;
[Category("TimeTrackBarControl"),Description("当前值")]
publicintBarCurValue
{
get
{
_BarCurValue=ue;
return_BarCurValue;
}
t
{
_BarCurValue=value;
if(_BarCurValue<0)_BarCurValue=0;
if(_BarCurValue>_BarMaximum)_BarCurValue=_BarMaximum;
ue=_BarCurValue;
BarCurValueChanged?.Invoke(this,newCurValueEventArgs(_BarCurValue));
}
}
privateColor_TimeScaleColor=gb(210,210,210);
[Category("TimeTrackBarControl"),Description("时间刻度的颜⾊")]
publicColorTimeScaleColor
{
get
{
return_TimeScaleColor;
}
t
{
_TimeScaleColor=value;
Invalidate();
}
}
privateint_ScaleInterval=1200;
[Category("TimeTrackBarControl"),Description("时间刻度之间相隔秒数,⼩于零表⽰⾃适应rn单位:秒")]
publicintScaleInterval
{
get
{
return_ScaleInterval;
}
t
{
_ScaleInterval=value;
//if(_ScaleInterval<=0)
//{
//_ScaleInterval=1800;
//}
Invalidate();
}
}
privateint_RealScaleInterval=1200;
[Category("TimeTrackBarControl"),Description("实际相隔的秒数(为了显⽰⾃适应时真实的间隔时间)rn单位:秒")]
publicintRealScaleInterval
{
get
{
_RealScaleInterval=_ScaleInterval>0?_ScaleInterval:_RealScaleInterval;
return_RealScaleInterval;
}
}
privateColor_TimeLabelBackColor=gb(255,192,192);
[Category("TimeTrackBarControl"),Description("时间label背景⾊")]
publicColorTimeLabelBackColor
{
get
{
return_TimeLabelBackColor;
}
t
{
_TimeLabelBackColor=value;
Invalidate();
}
}
privateColor_TimeLabelForeColor=gb(192,255,192);
[Category("TimeTrackBarControl"),Description("时间label前景⾊")]
publicColorTimeLabelForeColor
{
get
{
return_TimeLabelForeColor;
}
t
{
_TimeLabelForeColor=value;
Invalidate();
}
}
publicvoidSeekByTime(DateTimetime)
{
BarCurValue=(time-StartTime).();
}
#region⼀些系统事件
protectedoverridevoidOnPaint(PaintEventArg)
{
t(e);
ChangeStyle();
ingMode=ality;
Penpen=newPen(_TimeScaleColor,1);
Brushbrush=newSolidBrush(_TimeScaleColor);
Fontfont=newFont("微软雅⿊",10,r,,(byte)134);
List
for(inti=0;i<;i++)
{
TimeScaleLocationitem=scales[i];
intlength=15;
if(_RealScaleInterval*i%3600==0)
{
length=length+*1;
}
if(i==0||i==-1)
{
length=(int)(length+*1.5);
}
if(i==0)
{
item.x-=1;
}
ne(pen,item.x,item.y,item.x,item.y-length);
ring(ng("HH:mm"),font,brush,newPoint(item.x-19,*2));
}
}
protectedoverridevoidOnMouDown(MouEventArg)
{
eDown(e);
}
protectedoverridevoidOnMouMove(MouEventArg)
{
eMove(e);
}
protectedoverridevoidOnMouUp(MouEventArg)
{
eUp(e);
}
protectedoverridevoidOnMouEnter(EventArg)
{
eEnter(e);
}
protectedoverridevoidOnMouLeave(EventArg)
{
eLeave(e);
}
protectedoverridevoidOnSizeChanged(EventArg)
{
Changed(e);
intx=()/2;
inty=on.Y;
on=newPoint(x,y);
}
///
///要划线的坐标
///
///
///
privateList
{
DateTimetime=_StartTime;
if(_ScaleInterval<0)
{
_RealScaleInterval=SelfAdaption();
}
el
{
_RealScaleInterval=_ScaleInterval;
}
List
TimeScaleLocationstart_scale=newTimeScaleLocation(on.X,on.Y+/2,_StartTime);
(start_scale);
while(onds(_RealScaleInterval)<_EndTime)
{
time=onds(_RealScaleInterval);
intval=(time-_StartTime).();
floatradio=val*1.0f/_BarMaximum;
intx=on.X+32(*radio);
inty=on.Y;
TimeScaleLocationscale=newTimeScaleLocation(x,y,time);
(scale);
}
intend_x=on.X+;
intend_y=on.Y+/2;
TimeScaleLocationend_scale=newTimeScaleLocation(end_x,end_y,_EndTime);
(end_scale);
returnscales;
}
///
///微软雅⿊regular10F23:56分约占38个像素,现定为45个像素为最⼩值,时间刻度:60秒为最⼩值
///
///
privateintSelfAdaption()
{
floatradio=45*1.0f/;//45个像素占进度条总长的⽐例
doubleinterval=(_EndTime-_StartTime).TotalSeconds*radio;//这个⽐例下,占多长的时间
if(interval<=60)
{
interval=60;
}
elif(interval>60&&interval<=300)
{
interval=300;
}
elif(interval>300&&interval<=600)
{
interval=600;
}
elif(interval>600&&interval<=1200)
{
interval=1200;
}
elif(interval>1200&&interval<=1800)
{
interval=1800;
}
elif(interval>1800&&interval<=3600)
{
interval=3600;
}
32(interval);
}
privatevoidChangeStyle()
{
lor=_TimeLabelBackColor;
lor=_TimeLabelForeColor;
}
#endregion
///
///为了实时改变显⽰的值
///
///
///
privatevoidTrackBar_CurValueChanged(objectnder,CurValueEventArg)
{
BarCurValueChanged?.Invoke(this,newCurValueEventArgs());
=_onds().ToString("HH:mm:ss");
}
}
}
哦,要和⼤佬的例⼦放在⼀起,因为借⽤了他的控件和事件。还有,⼤佬的⽂章末尾有⼤佬代码的下载链接,嘿嘿~
没有七个#号的样式
###不信你看
转载请注明出处
本文发布于:2022-11-12 12:35:43,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/4561.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |