試圖實現windows進度條以大數字顯示字節下載進度,但無法正確執行。Progressbar範圍和位置,如何在C++中處理大數字?
如果我按照以下步驟下載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);
這是一個非常noobish實現,我不想落於XY情況,所以我的問題是什麼是以大小爲2-5GB的字節實現進度條的正確方法?
我試驗了兩種方法通過@msandiford和@NikBougalis以下建議,通過採取在帳戶中的進度條的寬度,並通過使用百分比,而不是實際數字,我甚至都合併,但在任何情況下,始終newIncrement出來0,也許這是因爲dlSize總是較低(在雙重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:看起來像它還是提早完成。
使用「PBM_SETPOS」而不是「PBM_DELTAPOS」會容易得多。我的答案中也有一個錯誤,現在已經修復,可能會導致錯誤的方向: – msandiford
@msandiford PBM_SETPOS會將進度條位置重置爲通過WPARAM提供的位置:) – StudentX
是的,這是正確的。計算進度條的絕對位置比計算精確的增量要容易得多。您需要做的就是跟蹤下載的數據總量。 – msandiford