2013-10-18 138 views
0

我正在使用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);

所以現在的問題是如何能夠讓我在酒吧的舉動,同時下載文件?考慮到我希望用簡潔的方式完成字幕樣式。

在此先感謝。

+1

使下載進入其他線程。即使沒有進度條,你也不應該在下載時掛上窗口。 – chris

+0

一個字:使用多個線程。 –

+0

在* synchronous * SOXDownload操作期間,您根本沒有處理消息。您將整個消息泵掛在主線程上。 – WhozCraig

回答

3

創建一個實現IBindStatusCallback接口的類,然後將它傳遞給最後一個參數URLDownloadToFile()。在下載過程中,您將收到OnProgress事件,您可以根據需要使用它更新UI,爲待處理消息泵送消息隊列等。

1

我想我會用InternetReadFile(或InternetReadFileEx)。這樣可以讓您一次讀取少量(例如4千字節),因此您可以定期更新狀態欄(並處理其他任何消息)。

要最大化UI響應,您可以執行異步讀取。這將讓您在下載過程中立即處理消息,而不是等待下一個4K(或其他)塊完成。通過快速連接,它可能不會有明顯的區別(4K通常不會很長),但通過一個緩慢或不可靠的連接,這可能是一個相當大的幫助。進行異步下載也使您有機會徹底取消交易,如果時間過長。