Поделиться через


Отображение индикатора хода выполнения

Область применения: 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. Выполните любую обработку, выполняемую для этого объекта. Если это подобъект и вы хотите отобразить ход выполнения во вложенных объектах, передайте в метод указатель на объект progress в параметре 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. Выполните любую обработку, выполняемую для этого объекта. Если объект является подобъектом, а поставщик отображает ход выполнения для вложенных объектов, передайте в метод указатель на объект progress в параметре 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)
    }
}
 

См. также