- •Глава 10 Меню и быстрые клавиши
- •Структура меню
- •Шаблон меню
- •Ссылки на меню в вашей программе
- •Меню и сообщения
- •Образец программы
- •Этикет при организации меню
- •Сложный способ определения меню
- •Независимые всплывающие меню
- •Третий подход к определению меню
- •Использование системного меню
- •Изменение меню
- •Другие команды меню
- •Нестандартный подход к меню
- •Использование в меню битовых образов
- •Два способа создания битовых образов для меню
- •Контекст памяти
- •Создание битового образа, содержащего текст
- •Масштабирование битовых образов
- •Соберем все вместе
- •Добавление интерфейса клавиатуры
- •Быстрые клавиши
- •Зачем нужны быстрые клавиши?
- •Некоторые правила назначения быстрых клавиш
- •Загрузка таблицы быстрых клавиш
- •Преобразование нажатий клавиш клавиатуры
- •Получение сообщений быстрых клавиш
- •Программа poppad, имеющая меню и быстрые клавиши
- •Разрешение пунктов меню
- •Обработка опций меню
Этикет при организации меню
Формат всплывающих меню File и Edit в программе MENUDEMO очень напоминает форматы этих меню в других программах для Windows. Одной из задач Windows является обеспечение пользователя таким интерфейсом, при котором для каждой новой программы не требуется изучение базовых концепций. Этому несомненно помогает то, что меню File и Edit выглядят одинаково в любой программе для Windows, а также то, что для выбора используются одни и те же комбинации символьных клавиш и клавиши <Alt>.
За исключением всплывающих меню File и Edit, остальные пункты меню программ для Windows отличаются от программы к программе. При создании меню вам необходимо изучить существующие программы для Windows и стремиться к поддержанию некоторого стандарта. Конечно, если вы считаете эти другие программы неправильными, и знаете лучший путь их создания, никто не посмеет вас остановить. Кроме этого запомните, что для исправления меню обычно требуется исправить только файл описания ресурсов, а не код программы. Позже, без каких бы то ни было проблем, вы сможете изменить пункты меню.
Хотя в главное меню программы могут быть включены инструкции MENUITEM, лучше этого не делать, поскольку в этом случае слишком велика вероятность их ошибочного выбора. Если вы их все-таки ввели, то для индикации того, что данный пункт меню не вызывает появления всплывающего меню, в конце строки текста ставьте восклицательный знак.
Сложный способ определения меню
Определение меню в файле описания ресурсов — это, как правило, простейший способ добавить меню к окну программы, но этот способ — не единственный. Вы можете обойтись без файла описания ресурсов и, с помощью вызовов функций CreateMenu и AppendMenu, создать все меню внутри программы. После завершения определения меню, можно передать описатель меню функции CreateWindow или использовать функцию SetMenu для установки меню окна.
Теперь о том, как это делается. Возвращаемым значением функции CreateMenu является просто описатель нового меню:
hMenu = CreateMenu () ;
В исходном состоянии меню не содержит ни одного элемента. Элементы в меню вставляются с помощью функции AppendMenu. Вам необходимо получить свой описатель меню для каждого пункта главного меню и для каждого всплывающего меню. Всплывающие меню строятся отдельно, а затем их описатели вставляются в меню верхнего уровня. Программа, приведенная на рис. 10.2, именно таким образом создает меню. Получившееся меню аналогично меню программы MENUDEMO.
hMenu = CreateMenu () ;
hMenuPopup = CreateMenu () ;
AppendMenu (hMenuPopup, MF_STRING, IDM_NEW, "&New") ;
AppendMenu (hMenuPopup, MF_STRING, IDM_OPEN, "&Open...") ;
AppendMenu (hMenuPopup, MF_STRING, IDM_SAVE, "&Save") ;
AppendMenu (hMenuPopup, MF_STRING, IDM_SAVEAS, "Save &As...") ;
AppendMenu (hMenuPopup, MF_SEPARATOR, 0, NULL) ;
AppendMenu (hMenuPopup, MF_STRING, IDM_EXIT, "E&xit") ;
AppendMenu (hMenu, MF_POPUP, (UINT) hMenuPopup, "&File") ;
hMenuPopup = CreateMenu () ;
AppendMenu (hMenuPopup, MF_STRING, IDM_UNDO, "&Undo") ;
AppendMenu (hMenuPopup, MF_SEPARATOR, 0, NULL) ;
AppendMenu (hMenuPopup, MF_STRING, IDM_CUT, "Cu&t") ;
AppendMenu (hMenuPopup, MF_STRING, IDM_COPY, "&Copy") ;
AppendMenu (hMenuPopup, MF_STRING, IDM_PASTE, "&Paste") ;
AppendMenu (hMenuPopup, MF_STRING, IDM_DEL, "De&lete") ;
AppendMenu (hMenu, MF_POPUP, (UINT) hMenuPopup, "&Edit") ;
hMenuPopup = CreateMenu () ;
AppendMenu (hMenuPopup, MF_STRING | MF_CHECKED, IDM_WHITE, "&White") ;
AppendMenu (hMenuPopup, MF_STRING, IDM_LTGRAY, "&Lt Gray") ;
AppendMenu (hMenuPopup, MF_STRING, IDM_GRAY, "&Gray") ;
AppendMenu (hMenuPopup, MF_STRING, IDM_DKGRAY, "&Dk Gray") ;
AppendMenu (hMenuPopup, MF_STRING, IDM_BLACK, "&Black") ;
AppendMenu (hMenu, MF_POPUP, (UINT) hMenuPopup, "&Background") ;
hMenuPopup = CreateMenu () ;
AppendMenu (hMenuPopup, MF_STRING, IDM_START, "&Start") ;
AppendMenu (hMenuPopup, MF_STRING | MF_GRAYED, IDM_STOP, "S&top") ;
AppendMenu (hMenu, MF_POPUP, (UINT) hMenuPopup, "&Timer") ;
hMenuPopup = CreateMenu () ;
AppendMenu (hMenuPopup, MF_STRING, IDM_HELP, "&Help...") ;
AppendMenu (hMenuPopup, MF_STRING, IDM_ABOUT, "&About MenuDemo...") ;
AppendMenu (hMenu, MF_POPUP, (UINT) hMenuPopup, "&Help") ;
Рис. 10.2. Код программы, создающий такое же меню, как в программе MENUDEMO, но без использования файла описания ресурсов
Согласитесь, что шаблон меню в файле описания ресурсов проще и понятнее. Не рекомендуется определять меню таким образом, а только показано, как это можно сделать. Несомненно, что вы могли бы существенно уменьшить размер кода, используя массивы структур, содержащие строки символов, идентификаторы и флаги всех пунктов меню. Действуя таким образом, вы получите преимущества при использовании третьего способа определения меню.
