void CMyDlg::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default CFile objFile;

objFile.Open("I:\\_work\\_MyProjects\\控制进度条增长和停止\\出师表.txt", 
CFile::modeRead,NULL);

UINT nCount = objFile.SeekToEnd();

static int nEachTime = 10;
FLOAT fPos = FLOAT(nEachTime) / FLOAT(nCount) * 1000;

if (nEachTime <= nCount)
{
m_progressbar.SetPos(fPos);
nEachTime += 10;
}
::CopyFile("I:\\_work\\_MyProjects\\控制进度条增长和停止\\出师表.txt",
"C:\\出师表.txt", FALSE);

CDialog::OnTimer(nIDEvent);
}在对话框中给确定按钮加入了消息响应函数onok(),在OnInitDialog()中加了个setrange()和settimer().这是我写的进度条,看上去也动,但是我感觉这么些太赖皮了,是个假象,窗口绘制的时候相应wm_timer消息,进度条就开始动了,但是这个时候还没拷贝文件.后来拷贝完了,进度条还在动,而且又拷贝文件一次.我希望是通过拷贝到目标文件的字节数占源文件字节数的"比例"来控制进度条的位置,但是这拷贝好像是一瞬间的事情,如何获得这个比例呢?正宗的进度条一般如何做啊?

解决方案 »

  1.   

    你自己都说出方法啦.
    拷贝到目标文件的字节数占源文件字节数的"比例"来控制进度条的位置 这是你的要求阿,照这个做不就完了
    在初始化的时候把要拷贝的总字节数计算出来,把进度条长度取出来准备好
    每次响应OnTimer消息的时候获取当前已经拷贝了多少字节,然后除一下得个百分比,然后再用进度条长度乘以百分比不就得到当前的长度了么
      

  2.   

    我觉得没有必要放在timer事件里吧 而是直接放在拷贝进度的代码里面,一边拷贝 一边setpos + 重绘
      

  3.   


    我现在就是苦于无法获得在每次响应ontimer消息的时候当前已经拷贝的字节数啦,有什么办法可以实现???
      

  4.   

    用多线程吧,用Timer没法确定时间的
      

  5.   

    上面回复的没看清lz的代码,lz用的是系统API,不是自己写的copy函数
    lz应该用CopyFileEx,
      

  6.   

    的确是应该开一个线程来通知进度条来正确的显示。除此之外别无它法。或者实现方式也不是很那啥的。
    你应该 float gpercent = 0.0;全局
    然后在拷贝函数里面把实际的百分比赋给这个值,
    在进度条的那个线程里面根据这个fpercent来决定进度到哪里。嗯一个读 一个写大概是不需要加锁的吧。而且基础数据赋值几乎都是原子操作。反正我的也没有出错。
    就这样
      

  7.   

    开个线程也没什么大不了的事情 这个线程函数甚至都不需要写超过5行代码来更新进度条
    额。。我倒是觉得若是不用线程反而复杂化了
    UINT FUNC(LPVOID l)
    {
    XXXDlg* pThis = (XXXDlg*)l;
    while(gpercent<1.0){
    l->m_progressbar.setpos(gpercent*maxvalue);
    }
    return 0;
    }
      

  8.   

    创建一个新线程,将进度条所在窗口句柄传给线程作参数在线程里用SendNotifyMessage发送自定义消息,消息参数包含进度进度条所在窗口处理消息,更新进度条
      

  9.   

    创建一个新线程,将进度条所在窗口句柄传给线程作参数在线程里用SendNotifyMessage发送自定义消息,消息参数包含进度进度条所在窗口处理消息,更新进度条
      

  10.   

    CopyFileEx这个函数支持回调函数,在其回调函数中可以实现对拷贝进度的监视,当然不用定时器了。
      

  11.   

    啥叫正宗啊。windows自己的那个复制文件的进度条算不算正宗。呵呵。
    这个接口应该能够满足你的要求:IProgressDialog
    系统自带的进度条。具体用法得详见MSDN了。