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消息,进度条就开始动了,但是这个时候还没拷贝文件.后来拷贝完了,进度条还在动,而且又拷贝文件一次.我希望是通过拷贝到目标文件的字节数占源文件字节数的"比例"来控制进度条的位置,但是这拷贝好像是一瞬间的事情,如何获得这个比例呢?正宗的进度条一般如何做啊?
{
// 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消息,进度条就开始动了,但是这个时候还没拷贝文件.后来拷贝完了,进度条还在动,而且又拷贝文件一次.我希望是通过拷贝到目标文件的字节数占源文件字节数的"比例"来控制进度条的位置,但是这拷贝好像是一瞬间的事情,如何获得这个比例呢?正宗的进度条一般如何做啊?
解决方案 »
- MFC坐标系问题
- 关于Document/View体系结构的应用范围
- 怎样屏蔽Esc键,即不想按下Esc时退出程序?
- 如何从COleDateTime中得到精确到毫秒的Second值?
- listctrl的数据绑定
- 谁知道曲线的流动蚂蚁线怎么实现
- 请问标签控件怎么用啊?怎么添加它的属性页?
- 串口通讯的问题,高手请进!!
- 请教:数据挖掘分类算法中,C4.5的算法描述,哪位大虾能提供?感激大恩不尽!!
- 为什么我的revc函数调用会导致调用_CrtIsValidHeapPointer
- 关于c++ 实现HTTP+XML通信编程问题
- ADO、DAO、OLEDB、ODBC方式连接数据库,指的只是连接那一块,还是包含了后续的增删改查用到的函数?
拷贝到目标文件的字节数占源文件字节数的"比例"来控制进度条的位置 这是你的要求阿,照这个做不就完了
在初始化的时候把要拷贝的总字节数计算出来,把进度条长度取出来准备好
每次响应OnTimer消息的时候获取当前已经拷贝了多少字节,然后除一下得个百分比,然后再用进度条长度乘以百分比不就得到当前的长度了么
我现在就是苦于无法获得在每次响应ontimer消息的时候当前已经拷贝的字节数啦,有什么办法可以实现???
lz应该用CopyFileEx,
你应该 float gpercent = 0.0;全局
然后在拷贝函数里面把实际的百分比赋给这个值,
在进度条的那个线程里面根据这个fpercent来决定进度到哪里。嗯一个读 一个写大概是不需要加锁的吧。而且基础数据赋值几乎都是原子操作。反正我的也没有出错。
就这样
额。。我倒是觉得若是不用线程反而复杂化了
UINT FUNC(LPVOID l)
{
XXXDlg* pThis = (XXXDlg*)l;
while(gpercent<1.0){
l->m_progressbar.setpos(gpercent*maxvalue);
}
return 0;
}
这个接口应该能够满足你的要求:IProgressDialog
系统自带的进度条。具体用法得详见MSDN了。