Прототип к варианту 21 - Просмотрщик структур меню, страница 2

Модифицируемая команда меню создается стандартными приемами работы с массивами элементов Visual Basic. Это гарантирует, что модифицируемой команде будет соответствовать элемент меню VB. Для получения идентификатора меню новой команды используется функция API GetMenuItemlD. Идентификатор используется при последующем вызове функции ModifyMenu, чтобы все сообщения WM_COMMAND от модифицированной команды меню продолжали передаваться элементу меню VB.

Следующая функция объединяет приемы, продемонстрированные в функциях CmdAddBitmap_ Click и CmdEntry2Chk_Click, для создания команд меню на базе нестандартных растров. В нашем примере в пустом растре (элемент Picture2) рисуется несколько случайных прямоугольников; этот растр используется в качестве команды меню. Обратите внимание на использование копии растра графического элемента. Растр сохраняется в глобальном массиве и уничтожается при выгрузке формы.

1 Команда создает случайный растр

При использовании растров в командах меню важно следить за тем, чтобы растр не уничтожался в течение всего времени, пока он находится в меню. Источником всей графики в программе MenuLook является элемент Picture2. Однако мы не можем просто использовать растр, возвращаемый свойством Image элемента, — этот растр изменяется во время работы приложения. Следующая функция создает копию растра, находящегося в графическом поле. Показанные здесь приемы основаны на материалах главы 9.

**-' Функция копирует свойство Image заданного графического поля -'  и возвращает манипулятор полученного растра

В функции CmdTrack_Click продемонстрированы два приема. Сначала она показывает, как временно скрыть меню, присваивая его свойству Caption пустую строку. На практике команду меню также следует заблокировать и расположить ее справа от всех остальных меню. Даже скрытое меню продолжает занимать место на экране. Помните о том, что меню нельзя скрыть, присвоив его свойству Visible значение FALSE — это приводит к уничтожению команды и связанного с ней всплывающего меню.

Далее эта функция показывает, как вывести перемещаемое всплывающее меню в позиции курсора.

Функция CmdAnalyze_Click получает манипулятор меню верхнего уровня формы, а затем вызывает процедуру ViewMenu для отображения структуры меню в списке Listl. Процедура ViewMenu является рекурсивной (то есть может вызывать саму себя для анализа подменю), поэтому всего один ее вызов приводит к отображению всей структуры меню.

'    Получить меню формы и проанализировать

Процедура ViewMenu заполняет список Listl описанием меню, манипулятор которого был передан ей в качестве параметра. Она показывает, как узнать количество команд в меню и как получить информацию о каждой команде, включая идентификатор меню и состояние команды. Процедура перебирает все всплывающие меню, связанные с текущим меню, и после завершения обработки всех команд рекурсивно вызывает себя для каждого всплывающего подменю.

В этой процедуре использованы два различных способа анализа меню. В Win 16 и Windows NT применяются стандартные функции API. В Windows 95 используются функции расширенных меню, работающие со структурой MENUTEMINFO. Важно подчеркнуть, что Windows 95 полностью совместима со стандартным набором функций API и использование новых функций не дает абсолютно никакого выигрыша — напротив, по сравнению со стандартными функциями потребуется гораздо более изощренная обработка строк. В данном случае эти функции используются по единственной причине — это программа-пример, а эти операции хорошо демонстрируют некоторые приемы работы со сложными структурами. Также следует помнить, что новые функции, хотя и используются в данном примере только в Windows 95, работают и в NT версии 4.0 и выше.

Фрагменты этой процедуры, связанные с использованием байтового массива для чтения строковой информации из структуры MENU1TEMINFO, подробно рассматриваются в разделе «Динамические строки в структурах» главы 15. Если вы захотите лучше разобраться в этой теме, возможно, вам следует прочитать этот раздел, прежде чем двигаться дальше.

'    Процедура анализирует заданное меню и заносит результаты в Listl

Функции GetFlagString и GetFlagStringNew получают список флагов, установленных для команды меню. В них используются две разные методики, для стандартных и расширенных функций меню.

1  Получает строку с описанием флагов, установленных для заданной '  команды меню.

Рекомендации для самостоятельной работы

Далее перечислены некоторые предложения по усовершенствованию программы MenuLook:

-в настоящем примере растр нестандартной команды меню всегда выводится на белом фоне. Измените приложение так, чтобы программа определяла фоновый цвет меню и использовала его при выводе растра (подсказка: обратитесь к функции GetSysColor в главе 6, а также PatBIt и другим графическим функциям в главе 9);

-попробуйте реализовать новую возможность создания команд-переключателей (аналогичных элементам-переключателям) в Windows 95 или NT 4.0;

-доработайте программу MenuLook, чтобы она анализировала текущее системное меню.