Menu

Функция Menu показывает меню.
int WINAPI Menu(
  int PluginNumber,
  int X,
  int Y,
  int MaxHeight,
  DWORD Flags,
  const char *Title,
  const char *Bottom,
  const char *HelpTopic,
  const int *BreakKeys,
  int *BreakCode,
  const struct FarMenuItem *Item,
  int ItemsNumber
);

Параметры

PluginNumber
Номер плагина. Его вы получаете в функции SetStartupInfo.
X,Y
Координаты верхнего левого угла меню
Чтобы назначить их автоматически, приравняйте их -1.
MaxHeight
Максимальное количество видимых на экране пунктов меню. Если высота меню меньше, чем число пунктов, то появится полоса прокрутки.
Чтобы использовать максимально возможное значение, установите этот параметр равным 0.
Flags
Может быть комбинацией из следующих значений (перечисление FARMENUFLAGS):
КонстантаОписание
FMENU_AUTOHIGHLIGHT Если указан, то горячие клавиши будут назначены автоматически, начиная с первого пункта.
FMENU_CHANGECONSOLETITLE Если указан, то FAR изменит заголовок консоли в значение, указанное в параметре Title (если Title не пуст).
FMENU_SHOWAMPERSAND При показе меню не использовать амперсанды (&) для определения горячих клавиш.
FMENU_REVERSEAUTOHIGHLIGHT Если указан, то горячие клавиши будут назначены автоматически, начиная с последнего пункта.
FMENU_USEEXT Вместо структуры FarMenuItem использовать структуру FarMenuItemEx.
FMENU_WRAPMODE Если указан, то попытка перемещения курсора выше первого пункта или ниже последнего будет приводить к перемещению соответственно к последнему или к первому пункту.

Этот флаг рекомендуется ставить всегда, когда нет специальных причин его не ставить.

Если выставлен флаг FMENU_USEEXT, то необходимо выполнить приведение типов:
struct FarMenuItemEx FooEx[]={
  ...
};
Info.Menu(...,FMENU_USEEXT|...,(const struct FarMenuItem *)FooEx,...)
Title
Заголовок меню. Укажите NULL, если заголовок меню не нужен.
Bottom
Нижняя строка меню. Укажите NULL, если нижняя строка меню не нужна.
HelpTopic
Тема в файле помощи, ассоциированная с меню. Может быть NULL, если подсказка не требуется.
BreakKeys
Адрес массива с кодами виртуальных клавиш (VK_*), которые будут закрывать меню. Последний элемент массива должен быть равным 0. Если вам не нужно определять такие клавиши в дополнение к стандартным (<Enter>, <Esc> и <F10>), установите этот параметр в NULL. Старшее слово (high word) элемента массива может быть или 0, или комбинацией флагов PKF_CONTROL, PKF_ALT и PKF_SHIFT для описания комбинаций клавиш.

Например, в плагине MultiArc реакция на нажатие клавиши F4 в меню "Archive commands" (Shift-F3 на архиве) обрабатывается так:

int BreakCode;
int BreakKeys[2]={VK_F4,0};
ExitCode=Info.Menu(Info.ModuleNumber,-1,-1,0,FMENU_USEEXT|FMENU_WRAPMODE,
     GetMsg(MArcCmdTitle),GetMsg(MSelectF4),"ArcCmd",BreakKeys,&BreakCode,
     (struct FarMenuItem *)MenuItems,Count);
if(ExitCode>=0)
{
  if(BreakCode == 0)  // F4 pressed
  {
    GetFormatName(MenuItems[0].Text.Text);
    ConfigCommands(MenuItems[0].Text.Text,2+MenuData[ExitCode].Cmd*2);
    continue;
  }
}
else
  return FALSE;
BreakCode
Адрес переменной, в которую будет записан номер элемента массива BreakKeys, использованного для закрытия меню, или -1, если меню было закрыто одной из стандартных клавиш. Этот параметр может быть равным NULL.
Item
Адрес массива структур FarMenuItem или, если указан флаг FMENU_USEEXT, то адрес массива структур FarMenuItemEx. Каждая структура описывает элемент меню.
ItemsNumber
Количество структур FarMenuItem.

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

Функция возвращает или -1, если пользователь отменил меню, или номер выбранного элемента меню.

Пример

Пример взят из плагина EditCase:
struct FarMenuItem MenuItems[2];
memset(MenuItems,0,sizeof(MenuItems));
strcpy(MenuItems[0].Text,GetMsg(MCaseLower));
strcpy(MenuItems[1].Text,GetMsg(MCaseUpper));
MenuItems[0].Selected=TRUE;
int MenuCode=Info.Menu(Info.ModuleNumber,-1,-
      1,0,FMENU_AUTOHIGHLIGHT|FMENU_WRAPMODE,
      GetMsg(MCaseConversion),NULL,
      "Contents",NULL,NULL,
      MenuItems,
      sizeof(MenuItems)/sizeof(MenuItems[0]));
if (MenuCode<0)
  return(INVALID_HANDLE_VALUE);
. . .
Причем, Info определяется как глобальная переменная:
struct PluginStartupInfo Info;
...а инициализируется она в функции SetStartupInfo:
void WINAPI _export SetStartupInfo(struct PluginStartupInfo *Info)
{
  ...
  ::Info=*Info;
  ...
}
Смотрите также:
FarMenuItem