Прототип к варианту 21 - Просмотрщик структур меню
В рабочем окне MenuLook, изображенном на рис. 10.3, продемонстрированы разнообразные приемы работы с меню. При нажатии кнопки Analyze производится анализ существующей структуры меню, а его результаты заносятся в список Listl,
В результатах анализа приводится манипулятор и описание каждой команды меню. Если команда открывает подменю, его манипулятор выводится вместе с именем. Манипуляторы всегда выводятся в шестнадцатеричной системе, а все остальные числа — в десятичной. Приложение поочередно анализирует все подменю с выводом имен и идентификаторов всех команд.
Рис. 10.3. Рабочее окно программы MenuLook
Кнопка Add Bitmap добавляет команду с растровым изображением в меню Floating. Используемый растр берется из свойства Picture элемента Picture!..
Если щелкнуть в любой точке формы, не принадлежащей какому-либо элементу, меню верхнего уровня Floating скрывается (для этого его свойству Caption присваивается пустая строка). Стандартный внешний вид строки меню показан на рис. 10.4. Затем программа получает манипулятор подменю, открываемого командой Floating, и отображает его как перемещаемое всплывающее меню в позиции курсора. То же самое происходит и при нажатии кнопки TrackPopup.
На рис. 10.4 показано, как выглядит меню Random после пятикратного нажатия кнопки Add-Random. Каждый раз в графическом поле PictureZ рисуется случайный набор прямоугольников. Затем изображение копируется в растр, который включается в меню Random.
Описание проекта
Проект MenuLook состоит из трех файлов. В программе используется всего одна форма MENULOOK.FRM. Единственный модуль программы, MENULOOK.BAS, содержит объявления констант, переменных и функций. Файл APIGID32.BAS содержит объявления функций библиотеки динамической компоновки APIGID32.DLL, прилагаемой к книге.
Описание формы
В листинге 10.1 приведен заголовок файла MENULOOK.FRM, описывающий расположение элементов на форме.
Листинг 10.1. MENULOOK.FRM
Файл MENULOOK.FRX содержит двоичные данные этой формы. Он определяет значение свойства Picture элемента Picture!.. При желании можно удалить из листинга строку Picture = MENULOOK.FRX:0000
Если вы это сделаете, откройте форму в режиме конструирования Visual Basic и загрузите не-бо'лыпой растр в свойство Picture элемента. В нашем примере используется растр ARGYLE.BMP из поставки Windows.
Листинги MenuLook
Модуль MENULOOK.BAS (листинг 10.2) содержит объявления констант, переменных и функций, используемых программой. В листинге 10.3 приведен программный код MENULOOK.FRM.
Листинг 10.2. MENULOOK.BAS
При загрузке приложение проверяет, работает ли оно в среде Windows 95, и сохраняет эту информацию в открытой переменной IsWindows95. Переменная используется для выбора одного из двух вариантов при анализе иерархии меню. В процедуре события Unload программа удаляет все созданные объекты растров.
Листинг 10.3. MENULOOK.FRM
В элементе Labell выводится информация о том, какая команда меню была выбрана. Это позволяет вам убедиться в том, что команда меню продолжает генерировать событие Visual Basic Click даже после того, как она была преобразована в растр или модифицирована иным образом. В этом элементе отображаются все события Click от меню. При некоторых событиях Click также изменяется состояние пометки команды.
В процедуре CmdEntry2Chk_Click продемонстрированы некоторые важные приемы. Прежде всего она показывает, как получить доступ к манипуляторам меню верхнего уровня формы и всплывающих меню, открываемых командами меню верхнего уровня. Этот прием неоднократно встречается в приложении.
При использовании растров в командах меню очень важно, чтобы растр не был изменен или уничтожен в то время, пока он используется приложением. Функция получает новый растр, используемый в качестве маркера; для этого она вызывает функцию GetNewCheck. В нашем примере непомеченное состояние обозначается так, как принято по умолчанию (маркер не выводится); тем не менее вы можете задать маркер как для помеченного, так и для непомеченного состояния. Манипулятор растра сохраняется для последующего уничтожения при выгрузке формы.
Функция GetNewCheck создает аппаратно-зависимый растр с использованием приемов, показанных в главе 9. Сначала она определяет стандартные размеры используемых маркеров. Полученный прямоугольник сжимается на два пиксела с каждой стороны; это делается по чисто эстетическим соображениям — Windows не требует уменьшать размеры растра. Используемое изображение выводится в графическом поле PictureZ. Затем функция CreateBitmapIndirect создает растр, а функция CreateCompatibleDC создает совместимый контекст устройства, через который к нему будет осуществляться доступ. Копирование выполняется простым вызовом BitBit, после которого контекст устройства уничтожается. Функция возвращает манипулятор растра, который должен быть уничтожен приложением перед завершением работы.
Функция CmdAddBitmap_Click преобразует растр в команду меню. Раньше в этом примере использовалось свойство Picture элемента Picturel, поскольку этот растр не изменялся на протяжении жизненного цикла программы. В некоторых конфигурациях операционной системы это уже не выполняется. По этой причине в настоящем издании этот пример был переработан, и в нем функция CopyPicturelmage создает копию растра.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.