Menu - меню.

Данный виджет позволяет создавать двухуровневое меню, которое может располагаться снизу или сверху экрана.

Создание виджета. Возращает ссылку на созданный виджет или NULL, если создать не удалось. В остальных функциях в качестве menu нужно передавать ссылку на созданный виджет.
CDKMENU *newCDKMenu (CDKSCREEN *cdkscreen, char *menulist[MAX_MENU_ITEMS][MAX_SUB_ITEMS], int menuListLength, int *submenuListLength, int *menuLocation, int menuPos, chtype titleAttribute, chtype subtitleAttribute);

cdkscreen - ранее созданный CDKSCREEN
menulist - массив имён пунктов меню
menuListLength - количество корневых пунктов меню
submenuListLength - массив количеств подпунктов каждого из корневых пунктов меню
menuLocation - массив с позициями каждого корневого пункта меню (возможные значения LEFT(слева) / RIGHT(справа))
menuPos - позиция строки меню (возможные значения TOP (сверху) / BOTTOM(снизу))
titleAttribute - атрибуты выбранного корневого элемента меню
subtitleAttribute - атрибуты выбранного подпункта меню

Уничтожение виджета.
void destroyCDKMenu (CDKMENU *menu);

Удаление виджета с экрана. (Сам виджет не удаляется.)
void eraseCDKMenu (CDKMENU *menu);

Установика атрибутов фона виджета attribute.
void setCDKMenuBackgroundAttrib (CDKMENU *menu, chtype attribute);

Прорисовка виджета.
void drawCDKMenu (CDKMENU *menu, boolean box);

Активирует виджет. Возвращаемое значение содержит выбранный пункт и подпункт меню. Корневой пункт меню целая часть от деления возвращаемого значения на 100. Подпункт меню остаток часть от деления возвращаемого значения на 100. Если menu->exitType равно vNORMAL при выборе подпункта меню и vESCAPE_HIT при нажатии Esc В качестве actions можно передать 0.
int activateCDKMenu (CDKMENU *menu,chtype * actions);

Функции получения и изменения состояния.

Получение номера корневого пункта меню menuItem и номера подпункта меню submenuItem.
void getCDKMenuCurrentItem (CDKMENU *menu, int *menuItem, int *submenuItem);

Установка номера корневого пункта меню menuItem и номера подпункта меню submenuItem.
void setCDKMenuCurrentItem (CDKMENU *menu, int menuItem, int submenuItem);

Установка состояния виджета.
void setCDKMenu (CDKMENU *menu, int menuItem, int submenuItem, chtype titleAttribute, chtype subtitleAttribute);

menuItem - номер текущего корневого пункта меню
submenuItem - номер текущего подпункта меню.
titleAttribute - атрибуты выбранного корневого элемента меню.
subtitleAttribute - атрибуты выбранного подпункта меню

Пример использования.

/*
    w_menu.c - пример простой программы демонстрирующей
		возможности виджета Menu библиотеки CDK.
		Выход осуществляется по клавише Esc или
		выбором пункта меню Файл->Выход.
		
    (C) Copyright 2006 Бердников Александр alexber220@yandex.ru
    Данная программа распростаняется по лицензии BSD.
*/

#include <cdk.h>

static char *menulist[MAX_MENU_ITEMS][MAX_SUB_ITEMS];

int main(int argc, char *argv[])
{
    CDKSCREEN *cdkscreen;
    CDKMENU *menu;
    WINDOW *screen;
    int submenusize[3], menuloc[4];
    int selection;
    
    
    // инициализация    
    screen = initscr();
    cdkscreen = initCDKScreen(screen);
    initCDKColor();

    //определяем пункты меню
    menulist[0][0] = "Файл";	menulist[1][0] = "Редактирование"; 
	menulist[2][0] = "Помощь";
    menulist[0][1] = "Открыть";	menulist[1][1] = "Вырезать ";
	menulist[2][1] = "О программе";
    menulist[0][2] = "Сохранить"; menulist[1][2] = "Скопировать";  
    menulist[0][3] = "Выход"; 	menulist[1][3] = "Вставить"; 
				     
    //задаём количество пунктов с подпунктами 
    //и позицию каждого корневого пункта меню
    submenusize[0] = 4;	menuloc[0] = LEFT;
    submenusize[1] = 4;	menuloc[1] = LEFT;
    submenusize[2] = 2;	menuloc[2] = RIGHT;
    
    //создаём виджет типа меню
    menu = newCDKMenu(cdkscreen, menulist, 3, submenusize, menuloc,
		      TOP, A_REVERSE, A_REVERSE);

    while (1)
    {
        //обновляем экран
	refreshCDKScreen (cdkscreen);
	
        //даём пользователю возможность выбрать пункт меню
	selection = activateCDKMenu (menu, 0);
	
	if (menu->exitType == vESCAPE_HIT)// если нажата Esc
	    break;
	else if ((menu->exitType == vNORMAL)// или выбран
		&& (selection%100 == 2)  // третий (считается от 0) подпункт
		&& (selection/100 == 0)) // первого корневого пункта меню
	    break;
    }

    //освобождаем ресурсы
    destroyCDKMenu(menu);
    destroyCDKScreen(cdkscreen);
    endCDK();
    
    return 0;
}

(C) Copyright 2006 Бердников Александр
Hosted by uCoz