Compartilhar via


Exibir um indicador de progresso

Aplica-se a: Outlook 2013 | Outlook 2016

Para exibir um indicador de progresso, chame IMAPIProgress::GetFlags para recuperar a configuração de sinalizadores atual.

Se o sinalizador MAPI_TOP_LEVEL estiver definido, conclua as seguintes etapas:

  1. Defina uma variável igual ao número total de itens a serem processados na operação. Por exemplo, se você estiver copiando o conteúdo de uma pasta, esse valor será igual ao número das subpastas na pasta mais o número de mensagens.

  2. Defina uma variável igual a 1000 dividida pelo número de itens.

  3. Se você estiver mostrando progresso para subobjectos, chame o método IMAPIProgress::SetLimits do objeto de progresso e passe os seguintes valores para os três parâmetros:

    • Defina o parâmetro lpulMin como 0.

    • Defina o parâmetro lpulMax como 1000.

    • Defina o parâmetro lpulFlags como MAPI_TOP_LEVEL.

  4. Para que cada objeto seja processado, conclua as seguintes etapas:

    1. Chame IMAPIProgress::SetLimits e passe os seguintes valores para os três parâmetros:
    • Defina o parâmetro lpulMin como a variável definida na etapa 2 multiplicada pelo item atual menos 1.

    • Defina o parâmetro lpulMax como a variável definida na etapa 2 multiplicada pelo objeto atual.

    • Defina o parâmetro lpulFlags como 0.

    1. Execute qualquer processamento que deva ser feito neste objeto. Se este for um subobjeto e você quiser exibir o progresso em subobjectos, passe um ponteiro para o objeto de progresso no parâmetro lpProgress para o método.

    2. Chame IMAPIProgress::P rogress e passe os seguintes valores para os três parâmetros:

    • Defina o parâmetro ulValue como a variável definida na etapa 2 multiplicada pelo objeto atual.

    • Defina o parâmetro ulCount como o objeto atual.

    • Defina o parâmetro ulTotal como a variável definida na etapa 1, o número total de objetos.

Se o sinalizador MAPI_TOP_LEVEL não estiver definido, conclua as seguintes etapas:

  1. Chame o método IMAPIProgress::GetMin do objeto progressão para recuperar o valor mínimo para a exibição.

  2. Chame IMAPIProgress::GetMax para recuperar o valor máximo para a exibição.

  3. Defina uma variável igual ao número total de objetos a serem processados.

  4. Defina uma variável igual ao resultado de subtrair o valor mínimo do valor máximo e, em seguida, dividir pelo número total de objetos.

  5. Para que cada objeto seja processado, conclua as seguintes etapas:

    1. Se o provedor estiver mostrando progresso para subobjectos, chame IMAPIProgress::SetLimits e passe os seguintes valores para os três parâmetros:
    • Defina o parâmetro lpulMin como o valor mínimo mais o item atual menos 1 multiplicado pela variável definida na etapa 4.

    • Defina o parâmetro lpulMax como o valor mínimo mais a unidade atual multiplicada pela variável definida na etapa 4.

    • Defina o parâmetro lpulFlags como 0.

    1. Execute qualquer processamento que deva ser feito neste objeto. Se o objeto for um subobjecto e seu provedor exibir progresso para subobjectos, passe um ponteiro para o objeto progress no parâmetro lpProgress para o método.

    2. Chame IMAPIProgress::P rogress e passe os seguintes valores para os três parâmetros:

    • Defina o parâmetro ulValue como variável definida na etapa 2 multiplicada pelo objeto atual.

    • Defina o parâmetro ulCount como 0.

    • Defina o parâmetro ulTotal como 0.

O exemplo de código a seguir ilustra a lógica necessária para mostrar o progresso em todos os níveis de uma operação que copia o conteúdo de uma pasta que contém cinco subpastas.

lpProgress->GetFlags (lpulFlags);
ulFlags = *lpulFlags;
/* The folder in charge of the display. It contains 5 subfolders. */
if (ulFlags & MAPI_TOP_LEVEL)
{
    ulItems = 5                         // 5 subfolders in this folder
    ulScale = (ulMax / ulItems)         // 200 because ulMax = 1000
    lpProgress->SetLimits(0, ulMax, MAPI_TOP_LEVEL)
    for (i = 1; i <= ulItems; i++)      // for each subfolder to copy
    {
        lpProgress->SetLimits( (i - 1) * ulScale, i * ulScale, 0)
        CopyOneFolder(lpFolder(i), lpProgress)
        lpProgress->Progress( i * ulScale, i, ulItems)
    }
}
else
/* One of the subfolders to be copied. It contains 3 messages. */
{
    lpProgress->GetMin(&ulMin);
    lpProgress->GetMax(&ulMax);
    ulItems = 3;
    ulDelta = (ulMax - ulMin) / ulItems;
    for (i = 1; i <= ulItems; i++)
    {
        lpProgress->SetLimits(ulMin + (i - 1) * ulDelta,
                              ulMin + i * ulDelta, 0)
        CopyOneFolder(lpFolder(i), lpProgress)
        /* Pass 0 for ulCount and ulTotal because this is not the */
        /* top-level display, and that information is unavailable */
        lpProgress->Progress( i * ulDelta, 0, 0)
    }
}
 

Confira também