Стандартне меню відображається у рядку меню вікна і складається з Головного меню (рядок вгорі: горизонтальні кнопки-вкладки) та Підменю (вертикальний список команд, що відкривається при виборі головного пункту).
Дані меню визначаються статично через структуру MENUITEM або через Data Box
типу MENU_DATA. Менеджер меню компілює ці дані у внутрішні структури і
присвоює MNID при реєстрації. Перед відображенням дані мають бути зареєстровані
через mcre_men() або mopn_men().
typedef struct menuitem {
UW inact; /* Прапор недоступних пунктів */
UW select; /* Прапор вибраних пунктів */
W desc; /* Внутрішній дескриптор (заповнюється менеджером) */
W dnum; /* Номер даних списку пунктів */
TC *ptr; /* Вказівник на список пунктів */
} MENUITEM;
inact — бітова маска: біт 0 = батьківський пункт, біти 1..N = підпункти.
Якщо біт встановлено — пункт недоступний (сірий).
select — аналогічно для стану «вибрано» (індикатор).
typedef struct menudisp {
UW m_frame; /* Ширина/патерн рамки головного меню */
UW s_frame; /* Ширина/патерн рамки підменю */
UW m_bgpat; /* Патерн фону головного меню */
UW s_bgpat; /* Патерн фону підменю */
UW s_indpat; /* Патерн індикатора */
COLOR m_chcol; /* Колір тексту головного меню */
COLOR s_chcol; /* Колір тексту підменю */
COLOR s_keycol; /* Колір клавіатурних макросів у підменю */
} MENUDISP;
Поля m_bgpat, s_bgpat, s_indpat задаються номерами
даних типу PAT_DATA; 0 = за замовчуванням. Поля кольорів < 0 = за замовчуванням.
#define MC_LINE 0x1004 /* Роздільна лінія */
#define MC_KEY 0x10f0 /* Маска кількості клавіатурних макросів */
#define MC_IND 0x1100 /* Наявність індикатора */
#define MC_SEL 0x1200 /* Стан індикатора */
#define MC_KEY1 0x1010 /* 1 клавіатурний макрос */
#define MC_KEY2 0x1020 /* 2 клавіатурних макроси */
~
#define MC_KEY15 0x10f0 /* 15 клавіатурних макросів */
#define M_LASTPOS 0x0000 /* Початковий пункт = останній використаний головний */ #define M_FIXPOS 0x0002 /* Початковий пункт = другий головний пункт */
#define M_STAT 0 /* Не змінювати (лише отримати поточний стан) */ #define M_SEL 1 /* Встановити стан «вибрано» */ #define M_NOSEL 4 /* Скасувати стан «вибрано» */ #define M_ACT 8 /* Зробити пункт доступним */ #define M_INACT 2 /* Зробити пункт недоступним */
На відміну від стандартного, Узагальнене меню (Меню) є вільно позиціонованим
контекстним popup-меню з довільними прямокутними зонами. Зони (r[32]) задаються
програмно, і менеджер відображає пункти у вказаних областях.
Під час відображення всі інші операції малювання блокуються.
typedef struct gmenu {
UW frame; /* Атрибути рамки */
UW bgpat; /* Патерн фону */
UW indpat; /* Патерн індикатора */
COLOR chcol; /* Колір тексту / роздільних рамок */
RECT area; /* Загальна область відображення */
UW inact; /* Прапор недоступних пунктів */
UW select; /* Прапор вибраних пунктів */
W desc; /* Внутрішній дескриптор */
W dnum; /* Номер даних списку пунктів */
TC *ptr; /* Вказівник на список пунктів */
W nitem; /* Кількість пунктів (макс. 128) */
RECT r[32]; /* Область відображення кожного пункту (nitem штук) */
} GMENU;
area задає загальний прямокутник (лівий верхній кут зазвичай (0,0);
фактична позиція задається при відображенні).
nitem — кількість пунктів (1..128).
r[i] — прямокутник i-го пункту у координатах відносно area.
Особливості атрибутів пунктів у GMENU:
MC_FIG = 1 (графічний пункт): 2-е слово даних — ширина символу (значення не
використовується, але обов'язкове).
MC_FIG = 0 (текстовий пункт): вирівнювання до лівого верхнього кута.
MC_LINE = 1 (роздільник): прямокутна рамка навколо зони (не горизонтальна лінія).
MC_KEY: ігнорується.
MC_IND = 1: індикатор малюється безпосередньо перед зоною пункту.
Усі функції повертають від'ємний код при помилці, «0» або «+» при успіху.
|
MNID mcre_men(MENUITEM *mi, MENUDISP *md)
MENUITEM *mi Структура даних меню MENUDISP *md Атрибути відображення (NULL = за замовчуванням)
>= 0 ID меню (MNID) < 0 Помилка (Код помилки)
Реєструє стандартне меню з даних mi та атрибутів відображення md.
Повертає ID меню MNID для подальшого використання.
Дані меню копіюються у внутрішні буфери менеджера, тому після реєстрації
структура mi може бути звільнена.
При завершенні процесу всі його меню автоматично видаляються, але рекомендується
явне видалення через mdel_men().
EX_ADR : Недопустима адреса mi або md. EX_NOSPC: Нестача системної пам'яті. EX_PAR : Неприпустимий вміст mi або md.
|
MNID mopn_men(W dnum, MENUDISP *md)
W dnum Номер даних типу MENU_DATA у Data Manager MENUDISP *md Атрибути відображення (NULL = за замовчуванням)
>= 0 ID меню (MNID) < 0 Помилка (Код помилки)
Аналог mcre_men(), але дані меню беруться з Data Box типу MENU_DATA
за номером dnum. У решті функція ідентична mcre_men().
EX_DNUM : Дані (dnum) не зареєстровані у Data Manager. EX_NOSPC: Нестача пам'яті. EX_PAR : Неприпустимий вміст даних.
|
ERR mdel_men(W mid)
W mid ID меню (MNID)
= 0 Успішне виконання < 0 Помилка (Код помилки)
Видаляє зареєстроване стандартне меню mid і звільняє пов'язані ресурси.
При завершенні процесу меню видаляється автоматично, але явне видалення є кращою практикою.
EX_MID : Меню (mid) не існує (або є не стандартним меню).
|
W msel_men(W mid, PNT pos, W opt, WEVENT *evt)
W mid ID меню PNT pos Абсолютна координата початку відображення меню W opt M_LASTPOS | M_FIXPOS — вибір початкового пункту WEVENT *evt Подія, що ініціювала відображення (EV_MENU)
>= 0 Номер вибраного пункту (1..N; 0 = нічого не вибрано) < 0 Помилка (Код помилки)
Відображає стандартне меню mid у позиції pos і очікує
дії користувача (переміщення + відпускання вказівника). При виборі пункту —
повертає його номер. При відсутності вибору — повертає 0.
opt визначає початковий головний пункт:
M_LASTPOS — останній використаний,
M_FIXPOS — другий пункт.
Під час роботи меню події EV_BUTDWN, EV_BUTUP,
EV_KEYDWN, EV_KEYUP, EV_AUTKEY видаляються
з черги. Інші події залишаються.
Якщо не вдається зберегти образ екрана — після закриття всі вікна отримують запит
перемальовування.
EX_ADR : Недопустима адреса evt. EX_MID : Меню (mid) не існує. EX_PAR : Подія evt не є EV_MENU.
|
W mget_itm(W mid, W num)
W mid ID меню W num Номер пункту (0 = батьківський; 1..N = підпункти)
>= 0 Поточний атрибут пункту (комбінація M_SEL / M_INACT) < 0 Помилка (Код помилки)
Повертає поточний атрибут пункту num меню mid. Значення
враховує як базовий список пунктів, так і прапори inact/select.
EX_MID : Меню (mid) не існує. EX_PAR : Неприпустимий номер пункту num.
|
W mset_itm(W mid, W num, UW mode)
W mid ID меню W num Номер пункту (0 = батьківський; 1..N = підпункти) UW mode M_STAT | M_SEL | M_NOSEL | M_ACT | M_INACT
>= 0 Попередній атрибут пункту < 0 Помилка (Код помилки)
Змінює атрибути (доступність, стан вибору) пункту num меню mid
і повертає попередній стан. Базові коди атрибутів пункту не змінюються.
Значення mode:
M_STAT M_SEL M_NOSEL M_ACT M_INACT
Для пунктів без індикатора (MC_IND = 0) M_SEL/M_NOSEL
ігноруються, повертається 0 у полі M_SEL.
EX_MID : Меню (mid) не існує. EX_PAR : Неприпустимий num або mode.
|
ERR mchg_atr(W mid, MENUDISP *md)
W mid ID меню MENUDISP *md Нові атрибути відображення (NULL = скинути до за замовчуванням)
= 0 Успішне виконання < 0 Помилка (Код помилки)
Змінює атрибути відображення (кольори, патерни) вже зареєстрованого меню mid.
При md = NULL — скидає до системних значень за замовчуванням.
EX_ADR : Недопустима адреса md. EX_MID : Меню (mid) не існує. EX_PAR : Неприпустимий вміст md.
|
ERR mchg_dsp(W mid, MENUITEM *mi)
W mid ID меню MENUITEM *mi Нові дані меню (NULL = перебудувати з поточних даних)
= 0 Успішне виконання < 0 Помилка (Код помилки)
Оновлює внутрішні дані відображення меню mid. При mi != NULL —
повністю замінює список пунктів. При mi = NULL — перебудовує відображення
з поточних даних (наприклад, після зміни атрибутів через mset_itm()).
EX_ADR : Недопустима адреса mi. EX_MID : Меню (mid) не існує. EX_NOSPC: Нестача пам'яті. EX_PAR : Неприпустимий вміст mi.
|
W mfnd_key(W mid, TC key)
W mid ID меню TC key Символ-ключ (клавіатурний макрос) для пошуку
>= 0 Номер пункту (0 = не знайдено) < 0 Помилка (Код помилки)
Шукає у меню mid пункт підменю, прив'язаний до символу клавіатурного
макросу key. Якщо знайдено — повертає номер пункту; якщо ні — 0.
Зазвичай використовується при обробці клавіатурних подій для «швидкого виклику» команд.
EX_MID : Меню (mid) не існує.
|
MNID mcre_gmn(GMENU *gm)
GMENU *gm Структура узагальненого меню
>= 0 ID меню (MNID) < 0 Помилка (Код помилки)
Реєструє узагальнене меню на основі структури GMENU. Повертає MNID.
Дані копіюються у внутрішні структури менеджера.
При завершенні процесу меню видаляється автоматично, але рекомендується явне
видалення через mdel_gmn().
EX_ADR : Недопустима адреса gm. EX_NOSPC: Нестача пам'яті. EX_PAR : Неприпустимий вміст gm.
|
MNID mopn_gmn(W dnum)
W dnum Номер даних типу GMENU_DATA у Data Manager
>= 0 ID меню (MNID) < 0 Помилка (Код помилки)
Аналог mcre_gmn(), але дані беруться з Data Box типу GMENU_DATA
за номером dnum. У решті ідентична mcre_gmn().
EX_DNUM : Дані (dnum) не зареєстровані у Data Manager. EX_NOSPC: Нестача пам'яті. EX_PAR : Неприпустимий вміст.
|
ERR mdel_gmn(W mid)
W mid ID меню (MNID)
= 0 Успішне виконання < 0 Помилка (Код помилки)
Видаляє зареєстроване узагальнене меню mid. При завершенні процесу —
автоматичне видалення, але явне є кращою практикою.
EX_MID : Меню (mid) не існує (або є не узагальненим меню).
|
W msel_gmn(W mid, PNT pos)
W mid ID меню PNT pos Абсолютна екранна координата (лівий верхній кут прямокутника меню)
>= 0 Номер вибраного пункту (1..128; 0 = нічого не вибрано) < 0 Помилка (Код помилки)
Відображає узагальнене меню mid, вирівнюючи лівий верхній кут до
pos. Очікує дії вказівника: при відпусканні над активним пунктом —
повертає його номер (1..128); при відпусканні поза пунктами — 0.
Під час роботи меню вказівник не змінюється — перед викликом рекомендується
встановити форму «вказівний палець».
Якщо не вдається зберегти образ екрана — після закриття надсилається запит
перемальовування всіх вікон.
Під час дії меню EV_BUTDWN, EV_BUTUP,
EV_KEYDWN, EV_KEYUP, EV_AUTKEY видаляються
з черги; інші події залишаються.
EX_MID : Меню (mid) не існує.
|
W mchg_gat(W mid, W num, UW mode)
W mid ID меню W num Номер пункту (1..128) UW mode M_STAT | M_SEL | M_NOSEL | M_ACT | M_INACT
>= 0 Поточний атрибут пункту після зміни < 0 Помилка (Код помилки)
Змінює прапори доступності та вибору пункту num узагальненого меню mid.
Повертає фактичний поточний стан (з урахуванням базових атрибутів пункту).
Коди атрибутів у списку пунктів не змінюються.
Для пунктів без індикатора (MC_IND = 0) — M_SEL/M_NOSEL
ігноруються; M_SEL у результаті завжди 0.
EX_MID : Меню (mid) не існує (або є не узагальненим меню). EX_PAR : Неприпустимий num.
|
W mchg_dtm(W time)
W time Час затримки у мілісекундах (< 0 = лише отримати поточне значення)
>= 0 Попереднє значення часу затримки
Встановлює час затримки відгуку між пунктами головного меню (час, протягом якого
підменю не змінюється при русі вказівника). Повертає попереднє значення.
При time < 0 — не змінює, лише повертає поточне значення.
При старті системи встановлюється системний час за замовчуванням.
Відсутні.