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:
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.
Defina uma variável igual a 1000 dividida pelo número de itens.
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.
Para que cada objeto seja processado, conclua as seguintes etapas:
- 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.
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.
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:
Chame o método IMAPIProgress::GetMin do objeto progressão para recuperar o valor mínimo para a exibição.
Chame IMAPIProgress::GetMax para recuperar o valor máximo para a exibição.
Defina uma variável igual ao número total de objetos a serem processados.
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.
Para que cada objeto seja processado, conclua as seguintes etapas:
- 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.
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.
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)
}
}