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

0

InternetReadFile(または)を使用すると思いますInternetReadFileEx。これにより、一度に少量 (たとえば 4 キロバイト) を読み取ることができるため、ステータス バーを定期的に更新できます (また、他のメッセージも処理できます)。

UI の応答性を最大化するために、非同期読み取りを行うことができます。これにより、次の 4K (またはその他の) ブロックが終了するのを待つ代わりに、ダウンロード中にすぐにメッセージを処理できます。高速な接続では、おそらく顕著な違いはありませんが (4K は通常、時間がかかりません)、低速または信頼性の低い接続では、かなり大きな助けになる可能性があります. 非同期ダウンロードを行うと、時間がかかりすぎる場合にトランザクションを完全にキャンセルする機会も得られます。

于 2013-10-18T23:41:08.417 に答える