尝试实现 Windows Progressbar,以大数字字节显示下载进度,但无法正确执行。
对于 2.5gb 的下载,如果我执行以下操作,则下载完成后它会在完整范围内结束。
double dlSize = getDlSize();
unsigned int pbRange = (unsigned int)( dlSize / 3000 );
SendMessage( hProgressbar, PBM_SETRANGE, 0, MAKELPARAM( 0, pbRange ) );
然后在每个下载回调中设置新位置:
double dlBytes = bytesDownloaded();
unsigned int newIncrement = (unsigned int)( dlBytes / 3000 );
SendMessage( hProgressbar, PBM_DELTAPOS, (WPARAM)newIncrement, 0 );
这是一个非常愚蠢的实现,我不想陷入 xy 的情况,所以我的问题是什么是正确的方法来实现一个以 2-5GB 为单位的大数字的进度条?
我尝试了@msandiford 和@NikBougalis 下面建议的两种方法,通过考虑进度条的宽度并使用百分比而不是实际数字,我什至将两者结合起来,但在所有情况下,newIncrement 总是出现 0,也许那是因为dlSize 总是较低(在 double newIncrement 中出现类似 1.15743e+007 的内容,类型转换它和它的 0 )。
我还能做什么?
结合两种方法的新代码:
编辑 2: 对代码添加了一些检查,因为我不断为 newIncrement 获得 0,看起来它现在可以工作,不确定效果如何:
GetClientRect(hProgressbar, &pbRCClient);
pbWidth = pbRCClient.right - pbRCClient.left; // (pbWidth its a global variable)
unsigned int pbRange = pbRCClient.right - pbRCClient.left;
SendMessage( hProgressbar, PBM_SETRANGE, 0, MAKELPARAM( 0, pbRange ) );
并在更新时:
double dlSize = getDlSize();
double doubleIncrement = ( ( dlSize * pbWidth ) / totalSize );
unsigned int newIncrement;
if ( (unsigned int)doubleIncrement < 1 )
{
blockFill += doubleIncrement;
if ( (unsigned int)blockFill > 1 )
{
newIncrement = ( unsigned int )blockFill;
SendMessage( hProgressbar, PBM_DELTAPOS, (WPARAM)newIncrement, 0 );
blockFill = 0;
}
}
else
{
newIncrement = ( unsigned int )( doubleIncrement );
SendMessage( hProgressbar, PBM_DELTAPOS, (WPARAM)newIncrement, 0 );
//blockFill = 0;
}
编辑3:看起来它仍然很早就完成了。