Отображение индикатора хода выполнения
Область применения: Outlook 2013 | Outlook 2016
Чтобы отобразить индикатор хода выполнения, вызовите IMAPIProgress::GetFlags , чтобы получить текущий параметр флагов.
Если флаг MAPI_TOP_LEVEL установлен, выполните следующие действия.
Задайте переменную, равную общему количеству элементов для обработки в операции. Например, при копировании содержимого папки это значение будет равно количеству вложенных папок в папке плюс числу сообщений.
Задайте переменную, равную 1000, делимую на количество элементов.
Если отображается ход выполнения для подобъектов, вызовите метод IMAPIProgress::SetLimits объекта выполнения и передайте следующие значения для трех параметров:
Задайте для параметра lpulMin значение 0.
Задайте для параметра lpulMax значение 1000.
Задайте для параметра lpulFlags значение MAPI_TOP_LEVEL.
Для обработки каждого объекта выполните следующие действия.
- Вызовите IMAPIProgress::SetLimits и передайте следующие значения для трех параметров:
Задайте для параметра lpulMin переменную, заданную на шаге 2, умноженную на текущий элемент минус 1.
Задайте для параметра lpulMax переменную, заданную на шаге 2, умноженную на текущий объект.
Задайте для параметра lpulFlags значение 0.
Выполните любую обработку, выполняемую для этого объекта. Если это подобъект и вы хотите отобразить ход выполнения во вложенных объектах, передайте в метод указатель на объект progress в параметре lpProgress .
Вызовите IMAPIProgress::P rogress и передайте следующие значения для трех параметров:
Задайте для параметра ulValue переменную, заданную на шаге 2, умноженную на текущий объект.
Задайте для параметра ulCount текущий объект.
Задайте для параметра ulTotal переменную, заданную на шаге 1, общее количество объектов.
Если флаг MAPI_TOP_LEVEL не задан, выполните следующие действия.
Вызовите метод IMAPIProgress::GetMin объекта выполнения, чтобы получить минимальное значение для отображения.
Вызовите IMAPIProgress::GetMax , чтобы получить максимальное значение для отображения.
Задайте переменную, равную общему количеству обрабатываемых объектов.
Задайте переменную, равную результату вычитания минимального значения из максимального значения, а затем деления на общее количество объектов.
Для обработки каждого объекта выполните следующие действия.
- Если поставщик отображает ход выполнения для подобъектов, вызовите IMAPIProgress::SetLimits и передайте следующие значения для трех параметров:
Задайте для параметра lpulMin минимальное значение плюс текущий элемент минус 1, умноженное на переменную, заданную на шаге 4.
Задайте для параметра lpulMax минимальное значение плюс текущую единицу, умноженную на переменную, заданную на шаге 4.
Задайте для параметра lpulFlags значение 0.
Выполните любую обработку, выполняемую для этого объекта. Если объект является подобъектом, а поставщик отображает ход выполнения для вложенных объектов, передайте в метод указатель на объект progress в параметре lpProgress .
Вызовите 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)
}
}