Этикет при организации меню
Формат всплывающих меню File и Edit в программах для Windows обычно имеет аналогичный вид. Одной из задач Windows является обеспечение пользователя таким интерфейсом, при котором для каждой новой программы не требуется изучение базовых концепций. Этому, несомненно, помогает то, что меню File и Edit выглядят одинаково в любой программе для Windows, а также то, что для выбора используются одни и те же комбинации символьных клавиш и клавиши <Alt>.
За исключением всплывающих меню File и Edit, остальные пункты меню программ для Windows отличаются от программы к программе. При создании меню вам необходимо изучить существующие программы для Windows и стремиться к поддержанию некоторого стандарта. Конечно, если вы считаете эти другие программы неправильными, и знаете лучший путь их создания, никто не посмеет вас остановить. Кроме этого запомните, что для исправления меню обычно требуется исправить только файл описания ресурсов, а не код программы.
Сложный способ определения меню
Определение меню в файле описания ресурсов — это, как правило, простейший способ добавить меню к окну программы, но этот способ — не единственный. Вы можете обойтись без файла описания ресурсов и, с помощью вызовов функций CreateMenu и AppendMenu, создать все меню внутри программы. После завершения определения меню, можно передать описатель меню функции Create Window или использовать функцию SetMenu для установки меню окна.
Теперь о том, как это делается. Возвращаемым значением функции CreateMenu является просто описатель нового меню:
hMenu = CreateMenu () ;
В исходном состоянии меню не содержит ни одного элемента. Элементы в меню вставляются с помощью функции AppendMenu. Вам необходимо получить свой описатель меню для каждого пункта главного меню и для каждого всплывающего меню. Всплывающие меню строятся отдельно, а затем их описатели вставляются в меню верхнего уровня.
hMenu = CreateMenu( ) ;
hMenuPopup = CreateMenu ( ) ;
AppendMenu (hMenuPopup, MF_STRING, IDM_NEH, "&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, MP_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, MP_STRING, IDM_PASTE, "&Paste") ;
AppendMenu (hMenuPopup, MF_STRING, IDMJ3EL, "De&lete") ;
AppendMenu (hMenu, MF_POPUP, (UINT) hMenuPopup, "&Edit") ;
hMenuPopup' = CreateMenu () ;
AppendMenu (hMenuPopup, MF_STRING I 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, "&SBlack") ;
AppendMenu (hMenu, MF_POPUP, (UINT) hMenuPopup, "{&Background") ;
hMenuPopup = CreateMenu () ;
AppendMenu (hMenuPopup, MF STRING, IDM START, "&Start") ;
AppendMenu (hMenuPopup, MF_STRING I 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") ;
Не рекомендуется определять меню таким образом, а только показано, как это можно сделать. Несомненно, что вы могли бы существенно уменьшить размер кода, используя массивы структур, содержащие строки символов, идентификаторы и флаги всех пунктов меню. Действуя таким образом, вы получите преимущества при использовании третьего способа определения меню.