首页 > 开发 > 综合 > 正文

C#在状态栏中,自绘进度条,

2024-07-21 02:18:16
字体:
来源:转载
供稿:网友
别的都没什么好说的了,说说这个在状态栏中,画进度条的办法吧.
偶是做网站的,一直很羡慕ftp软件中,地址栏中的进度条,那么酷....
一直在猜想,人家是怎么把进度条控件..放到地址栏上的???????

- -!! 汗...前几天因为工作需要,用utf格式来写web程序,还要成批处理.
写了这软件.一时灵感,试了试居然成功的自绘了进度条.

下面是源码:

(另:状态栏name: stat 三个item 分别是: stat_1 stat_2 stat_3 ,stat_3属性设置成自绘.
**************************************************************************
convert 按钮事件:
****************
private void fileconvert_click(object sender, system.eventargs e)
{
//stat files count and fill array(files), change stat.text,
//begin process
fileconvert.enabled=false;
sok.items.clear();
files.clear();
//show the layer ..... stating files, please wait...
statfiles(sdrive.text);
stat1.text=" files count:"+files.count.tostring();
stat2.text=" current:null";
filecount=files.count;
processing=true;
beginconvert(files);
messagebox.show("processed "+files.count.tostring()+" files.","提示",messageboxbuttons.ok,messageboxicon.information);
processing=false;
fileconvert.enabled=true;
}
************************************************************************
beginconvert()方法代码
********************
private void beginconvert(arraylist al)
{
string t="";
for(int n=0;n<al.count;n++)
{
try
{
if(file.exists(al[n].tostring()))
{
//=====================
stat2.text=" current:"+formatshortfile(al[n].tostring());
filecurrent=n+1;
stat.refresh();
application.doevents();
//=====================
t=io.read(al[n].tostring());
streamwriter sw=new streamwriter(al[n].tostring(),false,encoding.unicode);
sw.write(t);
sw.close();
sw=null;
sok.items.add((object)al[n].tostring().replace(sdrive.text,""));
}
}
catch(exception e)
{
messagebox.show(e.message,"提示",messageboxbuttons.ok,messageboxicon.exclamation);
}
}
}
**************************************************************************
(上面有一个 stat.refresh()...是让状态栏刷新.)
下面是stat的 drawitem事件代码.
*****************************
private void stat_drawitem(object sender, system.windows.forms.statusbardrawitemeventargs sbdevent)
{
if(processing) //判断是否正在处理中....
{
graphics g=stat.creategraphics();
int x,y,w,wall,h;
x=stat1.width+stat2.width+4;
y=4;
wall=stat.width-stat1.width-stat2.width-6;
w=wall * filecurrent / filecount;
h=stat.height-7;
int swidth=w-x;
rectanglef rect=new rectanglef(x,y,wall,h); //得到整个 stat_3 的bound
rectanglef rectdraw=new rectanglef(x,y,w,h); //当前处理的进度的 bound
//g.clip=new region(rect);
//计算 xx% 的坐标
string sb=convert.toint32((((float)filecurrent/(float)filecount)*100)).tostring()+"%";
sizef sf=g.measurestring(sb,new font("arial",9));
pointf pf=new pointf(stat1.width+stat2.width+6+(wall-sf.width)/2,(h-sf.height)/2+3);
if(processing)
{
g.drawstring(sb,new font("arial",9),new solidbrush(color.black),pf); //写上黑体的 xx %
g.fillrectangle(new solidbrush(color.fromargb(21,29,193)),rectdraw); // 填充当前进度的暗色方块.
g.clip=new region(rectdraw); //重新设置 clip为 当前进度的bound ,
g.drawstring(sb,new font("arial",9),new solidbrush(color.white),pf); //再写白色的 xx%
//这样就可以保证进度条不管到哪里,暗色方块上面的字,是白色,正常地方则是黑色.
}
g.dispose();
}

能力有限,自觉在取 stat_3 的 bound的时候,用的办法甚笨..
但找了半天,不知道还有什么办法可以直接得到.stat_3的bound .



发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表