Загрузить меню в оперативную память и получить указатель на его заголовок MENUITEMTEMPLATEHEADER можно, вставив в проект MenuMin фрагмент кода, приведенный в листинге 5.18.

Листинг 5.18

HRSRC Rsrc - FindResource(NULL. "IDR_MENU1". MAKEINTRESOURCE(RT_MENU)); HGLOBAL HG - LoadResource(NULL. Rsrc);

Заметим, что, в отличие от дескриптора HMENU, переменные Rsrc и HG являются адресами оперативной памяти. Как уже указывалось ранее, ресурс является частью исполняемого файла и загружается вместе с ним в оперативную память. Для поиска нужного ресурса в файле хранится таблица, содержащая размеры в байтах и смещения всех ресурсов от стартового адреса 400 ООО, а также имена ресурсов. Переменная Rsrc будет указывать адрес строки IDR_MENU1 в этой таблице.

Функция LoadResource() использует Rsrc для загрузки или поиска адреса начала найденного ресурса (в данном случае адреса заголовка меню) и записи его в переменную HG.

Другие типы исполняемых модулей, с которыми взаимодействует приложение (например, DLL-библиотеки), тоже могут содержать ресурсы. Указанные функции могут использоваться для поиска этих ресурсов, но тогда первым параметром надо указывать дескриптор исполняемого модуля, полученный при помощи функции GetModuleHandleO.

Посмотрев при помощи отладчика содержимое ОЗУ (рис. 5.3), на которое указывает переменная HG, можно увидеть, как разработчики организуют хранение в линейной памяти древовидных структур. Сначала в ячейку заносятся данные о левом узле самого верхнего уровня. Если это нетерминальный узел, то сохраняется

Создание и использование меню

связанное с узлом поддерево. После этого можно перейти к следующему узлу верхнего уровня. При размещении поддерева следуют тому же правилу. В нашем случае шаблон начинается с двух нулевых слов по адресу 0х4181Е0 - это версия и смещение. После этого располагается структура, описывающая подменю File. В слове флагов 0x10 бит 4 указывает, что данный пункт является подменю. После этого указывается название пункта (File) причем для каждого символа выделено два байта, признаком конца названия является слово с кодом 0. В следующих ячейках хранится описание терминального пункта подменю Import и слово флагов первого подпункта. В описании пункта Import можно увидеть байт 08 со взведенным битом 3, который отвечает за флаг CHECKED. После этого располагается идентификатор подпункта 0х9С41 (это десятичное число 40 001) и название подпункта Import. Еще дальше можно найти аналогичные описания пунктов Load и Save. Прокрутив окно в отладчике, можно увидеть, что в слове флагов последнего подпункта каждого подменю установлен в единицу бит 7. После подменю File следует заданное таким же образом следующее подменю Work.


⇐ Предыдущая| |Следующая ⇒