显示进度指示器

适用于:Outlook 2013 | Outlook 2016

若要显示进度指示器,请调用 IMAPIProgress::GetFlags 以检索当前标志设置。

如果设置了MAPI_TOP_LEVEL标志,请完成以下步骤:

  1. 设置一个等于操作中要处理的项总数的变量。 例如,如果要复制文件夹的内容,此值将等于文件夹中子文件夹的数目加上邮件数。

  2. 将一个变量设置为等于 1000 除以项数。

  3. 如果显示子对象的进度,请调用进度对象的 IMAPIProgress::SetLimits 方法,并为三个参数传递以下值:

    • lpulMin 参数设置为 0。

    • lpulMax 参数设置为 1000。

    • lpulFlags 参数设置为 MAPI_TOP_LEVEL。

  4. 对于要处理的每个对象,请完成以下步骤:

    1. 调用 IMAPIProgress::SetLimits 并为这三个参数传递以下值:
    • lpulMin 参数设置为步骤 2 中集的变量,再乘以当前项减去 1。

    • lpulMax 参数设置为步骤 2 中设置的变量,再乘以当前对象。

    • lpulFlags 参数设置为 0。

    1. 执行应对此对象执行的任何处理。 如果这是一个子对象,并且你想要在子对象上显示进度,请将指向 lpProgress 参数中进度对象的指针传递给 方法。

    2. 调用 IMAPIProgress::P rogress 并为这三个参数传递以下值:

    • ulValue 参数设置为步骤 2 中设置的变量,再乘以当前对象。

    • ulCount 参数设置为当前对象。

    • ulTotal 参数设置为步骤 1 中设置的变量,即对象总数。

如果未设置MAPI_TOP_LEVEL标志,请完成以下步骤:

  1. 调用进度对象的 IMAPIProgress::GetMin 方法以检索显示的最小值。

  2. 调用 IMAPIProgress::GetMax 以检索显示的最大值。

  3. 设置一个等于要处理的对象总数的变量。

  4. 将变量设置为等于从最大值中减去最小值,然后除以对象总数的结果。

  5. 对于要处理的每个对象,请完成以下步骤:

    1. 如果提供程序显示子对象的进度,请调用 IMAPIProgress::SetLimits 并为三个参数传递以下值:
    • lpulMin 参数设置为最小值加上当前项减去 1 乘以步骤 4 中设置的变量。

    • lpulMax 参数设置为最小值加上当前单位乘以步骤 4 中设置的变量。

    • lpulFlags 参数设置为 0。

    1. 执行应对此对象执行的任何处理。 如果对象是子对象,并且提供程序显示子对象进度,请将 指向 lpProgress 参数中进度对象的指针传递给 方法。

    2. 调用 IMAPIProgress::P rogress 并为这三个参数传递以下值:

    • ulValue 参数设置为步骤 2 中设置的变量,再乘以当前对象。

    • ulCount 参数设置为 0。

    • ulTotal 参数设置为 0。

下面的代码示例说明了在复制包含五个子文件夹的文件夹内容的操作的所有级别显示进度所需的逻辑。

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)
    }
}
 

另请参阅