0

我正在使用 Windows API 在 MS Visual C++ 中开发一个应用程序,该应用程序必须下载文件并将其放在文件夹中。

我已经使用 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);

所以问题是如何在下载文件时让栏移动?考虑到为了简单起见,我希望它使用选取框样式完成。

提前致谢。

4

2 回答 2

3

创建一个实现IBindStatusCallback接口的类,然后将其传递给URLDownloadToFile(). 然后,您将在下载期间收到OnProgress事件,您可以根据需要使用这些事件来更新您的 UI、为待处理的消息抽取消息队列等。

于 2013-10-19T15:50:01.677 回答
0

我想我会使用InternetReadFile(或InternetReadFileEx)。这将让您一次读取少量内容(例如,4 KB),以便您可以定期更新状态栏(以及处理任何其他消息)。

为了最大限度地提高 UI 响应能力,您可以进行异步读取。这将让您在下载期间立即处理消息,而不是等待下一个 4K(或其他)块完成。通过快速连接,它可能不会产生明显的差异(4K 通常不会花费很长时间),但通过缓慢或不可靠的连接,它可能是一个相当大的帮助。如果需要太长时间,进行异步下载还可以让您有机会彻底取消事务。

于 2013-10-18T23:41:08.417 回答