Перед включением в исполняемый модуль стандартные ресурсы подвергаются компиляции для более компактного хранения и упрощения их использования. При наличии в файле ресурсов ссылок на файлы изображений (пиктограмм, курсоров, битовых карт) эти данные также переносятся в файл ресурсов.
Меню, загруженное в оперативную память, начинается с заголовка, после которого следует последовательность шаблонов пунктов меню в порядке, заданном файлом ресурсов.
Заголовок имеет тип MENUITEMTEMPLATEHEADER, описание которого приводится ниже: typedef struct {
WORD versionNumber; // Версия. Обычно используется нулевое значение WORD offset: //Смещение до описания первого пункта меню. Если шаблон //первого пункта следует сразу за заголовком, тоже //используется нулевое значение } MENUITEMTEMPLATEHEADER: Структура шаблона пункта меню приведена ниже:
typedef struct { WORD mtOption:
Средства модификации и построения меню
WORD mtlD.; WCHAR mtString[l]; } MENUITEMTEMPLATE;
В поле mtOption хранятся флаги, описывающие пункт. Для нас важно, что кроме флагов MF_CHECKED, MF_GRAYED, MF_HELP, MF_MENUBARBREAK, MF_MENUBREAK, MF_OWNERDRAW, MF_P0PUP, определяющих свойства пункта (см. поля диалогового окна на рис. 5.1), в данном поле используются еще два флага. Бит 0x80 устанавливается, если данный пункт является в меню или подменю последним. Бит 4 устанавливается, если пункт является подменю и после него следует описание его подпунктов.
В параметре mtlD хранится идентификатор пункта. Для подменю это поле не используется и место в памяти ему не выделяется.
Параметр mtString содержит заканчивающуюся нулем строку с названием пункта. Тип WCHAR указывает, что для кодирования строки используется стандарт UNICODE, в котором каждому символу строки выделяется не байт, а слово. Для латиницы старший байт кода равен нулю, а младший совпадает с ASCII-кодом символа.
Заметим, что в шаблоне пункта отсутствует строка, комментирующая его назначение. Как и в файле ресурса, строки комментария размещаются в таблице строк. В нашем примере файл ресурсов содержит только меню и таблицу строк, поэтому она следует за шаблоном последнего пункта. Каждая строка задана в стиле Паскаля. Она начинается словом, содержащим количество символов, и у нее нет ограничивающего нуля в конце. Для таких данных в Windows предусмотрен специальный тип BSTR.