我正在使用Windows API的MS Visual C++中的應用程序,它必須下載一個文件並將其放在一個文件夾中。如何使用windows API下載文件時創建進度條?
我已經使用URLDownloadToFile函數實現了下載,但是我想創建一個帶有字幕樣式的PROGRESS_CLASS進度條,同時文件正在下載,但它似乎並沒有在過程中獲得動畫效果。
這是我使用的下載功能:
BOOL SOXDownload()
{
HRESULT hRez = URLDownloadToFile(NULL,
"url","C:\\sox.zip", 0, NULL);
if (hRez == E_OUTOFMEMORY) {
MessageBox(hWnd, "Out of memory Error","", MB_OK);
return FALSE;
}
if (hRez != S_OK) {
MessageBox(hWnd, "Error downloading sox.", "Error!", MB_ICONERROR | MB_SYSTEMMODAL);
return FALSE;
}
if (hRez == S_OK) {
BSTR file = SysAllocString(L"C:\\sox.zip");
BSTR folder = SysAllocString(L"C:\\");
Unzip2Folder(file, folder);
::MessageBoxA(hWnd, "Sox Binaries downloaded succesfully", "Success", MB_OK);
}
return TRUE;
}
後來我打電話內WM_CREATE(在我的主窗口消息處理):
if (!fileExists("C:\\SOX\\SOX.exe")) {
components[7] = CreateWindowEx(0, PROGRESS_CLASS,
NULL, WS_VISIBLE | PBS_MARQUEE,
GetSystemMetrics(SM_CXSCREEN)/2 - 80,
GetSystemMetrics(SM_CYSCREEN)/2 + 25,
200, 50, hWnd, NULL, NULL, NULL);
SetWindowText(components[7], "Downloading SoX");
SendMessage(components[7], PBM_SETRANGE, 0, (LPARAM) MAKELPARAM(0, 50));
SendMessage(components[7], PBM_SETMARQUEE, TRUE, MAKELPARAM(0, 50));
SOXDownload();
SendMessage(components[7], WM_CLOSE, NULL, NULL);
}
而且我想,我得到一個小進度條...但它不是動畫的,當我將光標放在條上時,光標指示程序正忙於下載文件。
當下載完成後,該窗口將關閉,因爲我要求:SendMessage(components[7], WM_CLOSE, NULL, NULL);
所以現在的問題是如何能夠讓我在酒吧的舉動,同時下載文件?考慮到我希望用簡潔的方式完成字幕樣式。
在此先感謝。
使下載進入其他線程。即使沒有進度條,你也不應該在下載時掛上窗口。 – chris
一個字:使用多個線程。 –
在* synchronous * SOXDownload操作期間,您根本沒有處理消息。您將整個消息泵掛在主線程上。 – WhozCraig