Message

Функция Message показывает сообщение.
int WINAPI Message(
  int PluginNumber,
  DWORD Flags,
  const char *HelpTopic,
  const char * const *Items,
  int ItemsNumber,
  int ButtonsNumber
);

Параметры

PluginNumber
Номер плагина. Его вы получаете в функции SetStartupInfo.
Flags
Может быть комбинацией следующих значений (перечисление FARMESSAGEFLAGS):
ФлагОписание
FMSG_WARNING Используются цвета "Предупреждения" (обычно белые буквы на красном фоне).
FMSG_ERRORTYPE Если тип ошибки, возвращаемый функцией GetLastError , известен FAR'у или Windows, то описание ошибки будет показано в первых строках сообщения. При этом строки, переданные плагином в функцию, сдвинутся вниз.
FMSG_KEEPBACKGROUND Не перерисовывать фон сообщения.
FMSG_DOWN Показать сообщение двумя строками ниже.
FMSG_LEFTALIGN Использовать для строк сообщения выравнивание влево (по умолчанию строки выводятся по центру).
FMSG_ALLINONE В этом случае параметра Items не является массивом указателей на строки - это УКАЗАТЕЛЬ на одну строку, в которой разделителем выводимых строк является символ '\n'.

Минимальное количество строк - 2 - заголовок и одна строка сообщения.

При указании флага FMSG_ALLINONE параметр ItemsNumber игнорируется и количество выводимых строк вычисляется автоматически (с учетом флагов-кнопок FMSG_MB_*).

Для подавления вывода заголовка при использовании флага FMSG_ALLINONE начните строку с символа '\n'.

FMSG_MB_OK Дополнительно выводится кнопка <Ok>
FMSG_MB_OKCANCEL Дополнительно выводятся кнопки <Ok> и <Cancel>
FMSG_MB_ABORTRETRYIGNORE Дополнительно выводятся кнопки <Abort>, <Retry> и <Ignore>
FMSG_MB_YESNO Дополнительно выводятся кнопки <Yes> и <No>
FMSG_MB_YESNOCANCEL Дополнительно выводятся кнопки <Yes>, <No> и <Cancel>
FMSG_MB_RETRYCANCEL Дополнительно выводятся кнопки <Retry> и <Cancel>
HelpTopic
Тема подсказки в файле помощи связанная с сообщением. Установите это значение в NULL если подсказка не требуется.
Items
Адрес массива с указателями на ASCIIZ строки. Первая строка - заголовок сообщения, последние ButtonsNumber строк - кнопки, все остальные строки принадлежат телу сообщения.
Для отрисовки одинарной разделительной линии начните строку с символа с кодом 1 (\x001).
Для отрисовки двойной разделительной линии начните строку с символа с кодом 2 (\x002).
Смотрите также описание флага FMSG_ALLINONE.
ItemsNumber
Количество указателей в массиве Items. Минимальное значение - 2 строки.
ButtonsNumber
Количество заключительных строк, которые будут использоваться в качестве кнопок. При указании флагов FMSG_MB_* параметр ButtonsNumber игнорируется.

Возвращаемое значение

Функция возвращает -1, если пользователь отменил сообщение (или системе не удалось выделить достаточно памяти для внутренних буферов), или выбранный номер кнопки (для первой кнопки - 0, для второй - 1 и так далее).

Замечания

  1. До FAR Manager 1.70 beta 4 суммарное количество элементов сообщения (строк и кнопок) не могло превышать 13.
  2. Если ButtonsNumber равен 0 (флаги FMSG_MB_* не используются) и выведенное сообщение больше не нужно, то плагин должен восстановить экран, используя функцию RestoreScreen или любым другим путем.
  3. Если ButtonsNumber не равен 0, то экран восстанавливает сам FAR.
  4. Диалог не выводится, если в качестве Items указан NULL или количество элементов меньше двух.
  5. При указании флагов-кнопок FMSG_MB_* параметр ButtonsNumber игнорируется.
  6. Кнопки могут иметь горячие клавиши.
  7. При использовании флага FMSG_ALLINONE для корректной компиляции кода необходимо произвести явное преобразование типов:
    Info.Message(Info.ModuleNumber,
      FMSG_ALLINONE|FMSG_MB_OKCANCEL,
      "HelpTopic",
      (const char * const *)"Title\nItem1\nItem2\nItem3",
      0,0);
    или
    const char *Msg="Title\nItem1\nItem2\nItem3\nOk\nCancel";
    Info.Message(Info.ModuleNumber,
      FMSG_ALLINONE,
      "HelpTopic",
      (const char * const *)Msg,
      0,2);

Пример

Следующая функция выводит на экран диалог-подтверждение на удаление файла:
диалог-подтверждение на удаление файла
BOOL IsDeleted(char *filename)
{
  const char *Msg[5];

  Msg[0]=GetMsg(MTitle);       // заголовок сообщения
  Msg[1]=GetMsg(MIsDeleted);   // тело сообщения
  Msg[2]=filename;
  Msg[3]=GetMsg(MDelete);      // последние ButtonsNumber (2) строк - кнопки
  Msg[4]=GetMsg(MCancel);

  return Info.Message(Info.ModuleNumber,
               0,
               "DeleteFile",
               Msg,
               sizeof(Msg)/sizeof(Msg[0]),
               2) == 0;
}
Причем, Info определяется как глобальная переменная:
struct PluginStartupInfo Info;
...а инициализируется она в функции SetStartupInfo:
void WINAPI _export SetStartupInfo(struct PluginStartupInfo *Info)
{
  ...
  ::Info=*Info;
  ...
}
Смотрите также:
Dialog