Робота з меню

У більшості Windows-додатків використовується меню Меню, що розташоване під заголовком вікна, називається віконним або головним меню Плаваюче меню може зявитися в будь-якому місці після клацання правої кнопки миші

Будь-яке меню складається з пунктів, що позначаються словом або графічним зображенням Пункт меню може бути відзначений галочкою, що означає вибір деякого режиму роботи програми Якщо після вибору пункту меню на екрані має зявитися діалогове вікно, то після назви пункту меню ставиться три крапки

За способом створення розрізняють статичне і динамічне меню Статичний меню створюється заздалегідь і не змінюється в процесі роботи програми Динамічне меню можливо змінювати залежно від потреб додатки

Найбільш простим способом створення меню є його опис як ресурсу в файлі ресурсів з розширенням гс Опис меню має наступний вигляд:

ідентіфікатор_меню MENU [load] [mem] BEGIN

END

Параметр load необовязковий Він використовується для визначення моменту завантаження меню в память Якщо цей параметр вказаний як PRELOAD, меню завантажується в память відразу після запуску програми За замовчуванням використовується значення LOADONCALL, в цьому випадку завантаження меню в память відбувається тільки при його відображенні

Параметр тет також необовязковий Він впливає на тип памяті, що виділяється для зберігання шаблону, і може вказуватися як FIXED (ресурс завжди залишається у фіксованій області памяті), MOVEABLE (при необхідності ресурс може переміщатися в памяті, це значення використовується за замовчуванням) або DISCARDABLE (якщо ресурс більше не потрібен, займана ним память може бути використана для інших задач) Значення DISCARDABLE може використовуватися разом зі значенням MOVEABLE

Між рядками BEGIN і END в описі меню розташовуються оператори опису рядків MENUITEM та оператори опису випадаючих меню POPUP

Оператор MENUITEM має наступний формат:

MENUITEM text, id [, param]

Параметр text визначає імя рядка меню в подвійних лапках, наприклад, File. Рядок може містити символи &, \ t, \ a Якщо в рядку меню перед буквою стоїть знак &, при виведенні меню дана буква буде підкреслена Наприклад, рядок & File буде відображатися як File. Клавіша, відповідна підкресленою букві, може бути використана в комбінації з клавішею для прискореного вибору рядка Для того щоб записати в рядок сам символ &, його слід повторити двічі Аналогічно, для запису в рядок меню символу подвійний лапки його також слід повторити двічі

Символ \ t включає в рядок меню символ табуляції і може бути використаний при вирівнюванні тексту в таблицях Цей символ зазвичай використовується тільки під випадають і плаваючих меню, але не в основному меню додатки, розташованому під заголовком головного вікна

Символ \ а вирівнює текст по правій межі меню, що випадає або смуги меню

Параметр id являє собою ціле число, яке повинно однозначно ідентифікувати рядок меню Додаток отримає це число в параметрі wParam повідомлення WMCOMMAND, коли буде обрана даний рядок

Необовязковий параметр рагат вказується як сукупність атрибутів, розділених комою або пробілом Атрибути, наведені нижче, визначають зовнішній вигляд і поведінку рядка меню:

• CHECKED при виведенні меню на екран рядок меню зазначається галочкою

• GRAYED рядок меню затемнений і знаходиться в неактивному стані Таку рядок не можна вибрати Цей ат-рібут несумісний з атрибутом INACTIVE

• HELP зліва від тексту розташовується роздільник у вигляді вертикальної лінії

• INACTIVE рядок меню відображається в нормальному вигляді (НЕ сірим кольором), але знаходиться в неактивному стані Цей атрибут несумісний з атрибутом GRAYED

• MENUBREAK якщо описується меню верхнього рівня, елемент меню виводиться з нового рядка Якщо описується меню, що випадає, елемент меню виводиться в новому стовпці

• MENUBARBREAK аналогічно атрибуту MENUBREAK, але додатково новий стовпець відокремлюється вертикальною лінією (використовується при створенні випадаючих меню)

Для опису випадаючих меню використовується оператор POPUP:

POPUP text [, param] BEGIN

END

Між рядками BEGIN і END в описі меню, що випадає розташовуються оператори опису рядків MENUITEM та оператори опису вкладених меню POPUP Параметри text і рагат вказуються так само, як і для оператора MENUITEM

Для того щоб створити в меню горизонтальну розділову лінію, використовується спеціальний вид оператора MENUITEM:

MENUITEM SEPARATOR

Пояснимо сказане вище на простому прикладі Нехай необхідно

створити головне меню, що включає пункти File, Test і Help, причому пунктам File і Help відповідає меню, що випадає з одного пункту, пункту Test меню, що випадає з трьох пунктів Таке меню бу-дет описано в файлі ресурсів таким чином:

MYAPP MENU DISCARDABIiE BEGIN

POPUP &quotFile&quot BEGIN

MENUITEM &quotExit&quot, 101 END

POPUP &quotTest&quot BEGIN

MENUITEM &quotItem 1&quot, 201

MENUITEM &quotItem 2&quot, 202

MENUITEM &quotItem 3&quot, 203 END

POPUP &quotHelp&quot BEGIN

MENUITEM &quotAbout My Application..&quot, 301 END END

При виборі пункту File вікно додатка має вигляд, представлений на малюнку 31, а, а при виборі пункту «Test» вигляд, представлений на малюнку 31,6

Малюнок 31

Наступний етап після створення ресурсу меню підключення меню до вікна програми

Підключити меню можна на етапі реєстрації класу вікна або для окремого вікна при його створенні функцією CreateWindow(Ex)

Якщо при реєстрації класу вікна в поле IpszMenuName структури типу WNDCLASS вказати адресу текстового рядка, що містить імя шаблону меню в файлі ресурсів, все перекриваються і тимчасові вікна, що створюються на базі цього класу, будуть мати меню, певне даними шаблоном Дочірні вікна (child window) не можуть мати меню Наприклад, нехай у файлі опису ресурсів шаблон меню визначений під імям APPMENU:

APP_MENU MENU BEGIN

END

У цьому випадку для підключення меню при реєстрації класу ви повинні записати адресу текстового рядка APPMENU в поле IpszMenuName структури wc, що має тип WNDCLASS:

wcIpszMenuName = &quotAPP_MENU&quot

Коли для класу вікна визначено меню, все перекриваються і тимчасові вікна, що створюються на базі цього класу, будуть мати меню, якщо при створенні вікна функцією CreateWindow вказано ідентифікатор меню, рівний нулю

Для підключення меню, відмінного від зазначеного в класі вікна, необхідно задати ідентифікатор потрібного меню при створенні вікна функцією CreateWindow через 9 параметр цієї функції дескриптор меню hMenu

Значення параметра ідентифікатора меню може бути отримано, наприклад, від функції LoadMenu , Визначеної в програмному інтерфейсі Windows Параметри LoadMenu:

– дескриптор поточної копії додатку, отриманий через відповідний параметр функції WinMain

– покажчик IpszMenuName на рядок символів, що закінчується двійковим нулем і містить імя завантаженого шаблону меню

Перед завершенням своєї роботи додаток повинен знищити завантажене меню функцією DestroyMenu, якої передається його дескриптор

Для динамічного створення і зміни меню використовуються функції CreateMenu, AppendMenu, LoadMenuIndirect, InsertMenu, RemoveMenu, SetMenuItemlnfo, CheckMenuItem, EnableMenuItem,

ModifyMenu

Меню посилає у віконну функцію створив його вікна наступні повідомлення Повідомлення WMINITMENU надсилається перед відображенням меню і може бути використано для ініціалізації Повідомлення WMCOMMAND надсилається після того, як користувач вибере одну з активних рядків меню Системне меню посилає у вікно додатка повідомлення WMSYSCOMMAND, яке зазвичай не обробляється додатком (передається функції DefWindowProc) У процесі вибору рядка з меню, коли курсор переміщається по рядках меню, функція вікна, який створив меню, отримує повідомлення WMMENUSELECT Перед ініціалізацією меню, що випадає функція вікна отримує повідомлення WMINITMENUPOPUP

З усіх цих повідомлень найбільший інтерес представляють повідомлення WMINITMENU, WMINITMENUPOPUP, WMCOMMAND, WMSYSCOMMAND Розглянемо їх більш докладно

Повідомлення WMINITMENU надсилається вікна, що створив меню, в момент відображення меню Це відбувається при натисканні на рядок в смузі меню або активізації меню, що випадає за допомогою клавіатури Разом з цим сполученням в параметрі wParam передається ідентифікатор активизируемого меню Обробка WMINITMENU може полягати в активізації або деактивизации рядків меню, зміні стану рядків (відмічене галочкою або зазначене) і т п за допомогою перерахованих вище функцій роботи з динамічним меню

Повідомлення WMINITMENUPOPUP надсилається вікна, коли Windows готова відобразити меню, що випадає Молодше слово пара-метра IParam містить порядковий номер випадаючого меню в меню верхнього рівня, старше слово містить 1 для системного меню або Про для звичайного меню Це повідомлення можна використовувати для активізації або блокування окремих рядків меню, що випадає

Повідомлення WMMENUSELECT генерується в процесі переміщення курсору по рядках меню, його цінність полягає у відображенні поточних дій користувача Молодше слово wParam містить ідентифікатор пункту меню Старше слово wParam містить стан пункту меню:

MFCHECKED відзначений

MFDISABLED заблокований

MFGRAYED недоступний

MFHILITE висвітлений

MFMOUSESELECT обраний мишею

MFPOPUP відкривається меню, що випадає

Повідомлення WMCOMMAND надсилається при виборі пункту меню Параметр wParam містить ідентифікатор пункту меню, визначений у шаблоні меню У віконної функції, обробній повідомлення від меню, значення параметра wParam перевіряються і виконуються відповідні дії

Повідомлення WMSYSCOMMAND приходить у функцію вікна програми, коли користувач вибирає рядок з системного меню Параметр wParam, як і для повідомлення WMCOMMAND, містить ідентифікатор рядка меню, в даному випадку, ідентифікатор рядка системного меню

Розглянемо приклад обробки вибору пунктів меню у віконній функції Нехай у файлі menurc описано меню, що складається з 4 пунктів, кожному з яких призначений свій ідентифікатор:

#define IDM_TEST 100 #define IDM_HELLO 200 #define IDM_GOODBYE 300 #define IDM_EXIT 400 700 MENU DISCARDABIiE BEGIN

POPUP &quot&ampShow&quot BEGIN

MENUITEM &quotTest&quot, IDMJTEST MENUITEM &quotHello&quot,  IDM_HELLO MENUITEM &quotBye&quot,  IDM_GOODBYE MENUITEM &quotExit&quot, IDM_EXIT END END

Обробка вибору цих пунктів, за винятком пункту EXIT, полягає у виведенні текстових повідомлень, описаних як рядки, що завершуються двійковими нулями:

szText Test_string,&quotTest menu item&quot s z Text Hello_s tring,&quotHello &quot s z Text Goodbye_s tring,&quotBye&quot

Віконна функція має вигляд:

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM IF uMsg==WM_DESTROY

invoke PostQuitMessage,NULL

.ELSEIF uMsg==WM_COMMAND mov eax,wParam IF eax=IDM_TEST

invoke MessageBox, NULL, ADDR Test_string, OFFSET AppName, MB_OK ELSEIF eax=IDM_HELLO

invoke MessageBox, NULL, ADDR Hello_string, OFFSET AppName,MB_OK ELSEIF eax=IDM_GOODBYE

invoke MessageBox,NULL,

ADDR Goodbye_string, OFFSET AppName, MB_OK ELSE

invoke DestroyWindow,hWnd ENDIF ELSE

invoke DefWindowProc, hWnd, uMsg, wParam,

lParam ret ENDIF xor eax,eax ret WndProc endp

Для роботи з плаваючим меню використовується функція TrackPopupMenu, яка виводить плаваюче меню на екран і створює власний цикл обробки повідомлень, що завершується після вибору рядка з цього меню Управління не повертається до тих пір, поки не буде обрана рядок або поки не буде отримано відмову від вибору Розглянемо параметри функції:

– дескриптор плаваючого меню Формується функцією Create-PopupMenu або GetSubMenu

– ціле беззнакове число, біти якого задають параметри для меню (розміщення меню по горизонталі і вертикалі щодо відповідно координат х і у, що задаються 3 і 4 параметрами функції TrackPopupMenu, наявність або відсутність посилки повідомлень при виборі рядків меню, по правій або лівій кнопці миші виводиться плаваюче меню)

– х і у-координати щодо лівого верхнього кута екрану

– зарезервований параметр, рівний нулю при виклику

– дескриптор вікна, якому адресовані повідомлення від меню

– покажчик на прямокутну область екрану, в межах якої

клацання по пунктах меню будуть оброблені Якщо клацання буде поза цій галузі, то плаваюче меню зникне

Функція TrackPopupMenu повертає ідентифікатор обраного рядка або нульове значення, якщо нічого не було обрано

Джерело: Сучкова, ЛІ Win32 API: основи програмування: навчальний посібник / ЛІ Сучкова АлтГТУ ім ШІ Ползунова -Барнаул, АлтГТУ, 2010 138 с, іл

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*