Динамическое меню windows это

Динамическое меню windows это

Рис. SEQ Рис. \* ARABIC 1 . Основное меню Windows.

В операционной системе Windows используется несколько видов меню.

1. Основное меню (меню кнопки «Пуск») показано на рис.1. Оно вызывается щелчком по кнопке «Пуск» и вид его зависит от настроек пользователя. Его опции:

§ Завершение работы – завершениеработы , перезагрузки компьютера, входа под другим паролем

§ Выполнить – можно загрузить на выполнение программу, которая отсутствует в меню «Программы»

§ Справка и поддержка – можно получить справку по системе Windows

§ Найти – позволяет находить информацию на данном компьютере или в Интернете

§ Настройка – позволяет изменять параметры устройств подключенных к данному компьютеру

§ Документы – открывает список последних 15 документов, открывавшихся на данном компьютере под данным паролем

§ Программы – открывает список программ, которые установлены на данном компьютере, для загрузки.

Остальные опции меню говорят сами за себя.

Рис. 2 . Системное меню .

Системное меню (вызов – щелчок по пиктограмме окна в строке названия (левый рисуночек в синей строке окна)). Позволяет управлять окнами Windows, используя клавиатуру (если не видны кнопки правого верхнего угла окна (кнопки «Свернуть», «Развернуть», «Закрыть»)). Можно использовать, если мышь почему либо не работает.

Рис. 3. Вид командного меню приложения Word .

Командное меню приложения (во всех окнах приложений строка меню). Число и содержание опций командного меню разное у разных программ. Например, у программы текстового процессора Word это опции «файл», «правка», «вид», «вставка», «формат», «сервис», «таблица», «окно», «помощь».

Рис. 4. Командное меню объекта

4. Командное меню объекта (файл_правка_вид_?). Показано на рисунке 4 для окна «Мой компьютер»

Рис. 5. Инструментальное меню.

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

Рис. 6. Контекстное меню

6 . Контекстное меню (рис.6.) вызывается всегда правым щелчком мыши. Для каждого объекта контекстное меню имеет другой вид, поэтому его еще называют контекстно-зависимым. Этот вид меню, наверно, самый используемый. Практически все операции над объектами можно сделать, используя контекстное меню.

7. Всплывающее (распашное) меню (рис.7). Вызывается щелчком по соответствующей пиктограмме. Выбор подопций производится аналогично остальным видам меню.

Настройка контекстного меню с помощью динамических команд

Обработчики контекстного меню также известны как обработчики контекстного меню или обработчики команд. Обработчик контекстного меню — это тип обработчика типа файлов.

Этот раздел организован следующим образом:

О статических и динамических командах

Мы настоятельно рекомендуем реализовать контекстное меню с помощью одного из статических методов глагола. Рекомендуется следовать инструкциям, приведенным в разделе «Настройка контекстного меню с помощью статических глаголов» раздела Создание обработчиков контекстного меню. Чтобы получить динамическое поведение для статических глаголов в Windows 7 и более поздних версиях, см. раздел «получение динамического поведения для статических глаголов» раздела Создание обработчиков контекстного меню. Дополнительные сведения о реализации статических команд и о том, какие динамические команды следует избегать, см. в разделе Выбор статической или динамической команды для контекстного меню.

Читайте также:  Samba freebsd для windows

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

При регистрации обработчиков, работающих в контексте 32-разрядных приложений, существуют особые рекомендации для 64-разрядных систем: при вызове команд оболочки в контексте 32-разрядного приложения Подсистема WOW64 перенаправляет доступ к некоторым путям в файловой системе. Если обработчик. exe хранится в одном из этих путей, он недоступен в этом контексте. Поэтому в качестве решения сохраните EXE-файл в пути, который не перенаправлен, или сохраните версию заглушки exe-файла, которая запускает реальную версию.

Работа обработчиков контекстного меню с динамическими командами

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

Дополнительные сведения об элементах меню, рисуемых владельцем, см. в разделе создание Owner-Drawn пунктов меню раздела Использование меню.

Оболочка использует интерфейс ишеллекстинит для инициализации обработчика. Когда оболочка вызывает ишеллекстинит:: Initialize, она передает объект данных с именем объекта и указателем на список идентификаторов элементов (Пидл) папки, содержащей файл. Параметр хкэйпрогид — это расположение реестра, в котором зарегистрирован маркер контекстного меню. Метод ишеллекстинит:: Initialize должен извлечь имя файла из объекта данных и сохранить имя и указатель папки в списке идентификаторов элементов (Пидл) для последующего использования. Дополнительные сведения об инициализации обработчика см. в разделе Реализация ишеллекстинит.

Когда глаголы представлены в контекстном меню, они сначала обнаруживаются, затем представляются пользователю, и, наконец, вызываются. В следующем списке приведено более подробное описание этих трех шагов.

  1. Оболочка вызывает метод IContextMenu:: куериконтекстмену, возвращающий набор команд, которые могут основываться на состоянии элементов или системы.
  2. Система передает в HMENUный обработчик, который метод может использовать для добавления элементов в контекстное меню.
  3. Если пользователь щелкает один из элементов обработчика, оболочка вызывает IContextMenu:: инвокекомманд. Затем обработчик может выполнить соответствующую команду.

Предотвращение конфликтов из-за неуточненных имен команд

Так как глаголы зарегистрированы для каждого типа, одно и то же имя команды можно использовать для глаголов в различных элементах. Это позволяет приложениям ссылаться на общие глаголы независимо от типа элемента. Хотя эта функция полезна, использование неквалифицированных имен может привести к конфликтам с несколькими независимыми поставщиками программного обеспечения (ISV), которые выбирают одно и то же имя команды. Чтобы избежать этого, всегда добавляйте перед глаголами имя ISV следующим образом:

Всегда используйте идентификатор ProgID, зависящий от приложения. Применение соглашения о сопоставлении расширения имени файла с ProgID, предоставленным поставщиком программного обеспечения, позволяет избежать возможных конфликтов. Однако, поскольку некоторые типы элементов не используют это сопоставление, существует потребность в уникальных именах поставщиков. При добавлении команды к существующему идентификатору ProgID, который может уже зарегистрировать эту команду, необходимо сначала удалить раздел реестра для старой команды перед добавлением собственной команды. Это необходимо сделать, чтобы избежать объединения сведений о командах из двух глаголов. Несоблюдение этого действия приводит к непредсказуемому поведению.

Регистрация обработчика контекстного меню с динамической командой

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

Чтобы связать обработчик контекстного меню с типом файла или папкой, сначала создайте подраздел в подразделе контекстменухандлерс . Назовите подраздел для обработчика и задайте в качестве значения по умолчанию для подраздела строковое значение GUID идентификатора класса обработчика (CLSID).

Читайте также:  Rundll32 exe c windows system32 shimgvw dll imageview

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

Дополнительные сведения о типах папок, для которых можно зарегистрировать обработчики, см. в разделе Регистрация обработчиков расширений оболочки.

Если с типом файла связано контекстное меню, то при двойном щелчке объекта обычно запускается команда по умолчанию, а метод IContextMenu:: куериконтекстмену обработчика не вызывается. Чтобы указать, что метод IContextMenu:: куериконтекстмену обработчика должен вызываться при двойном щелчке объекта, создайте подраздел в подразделе CLSID обработчика, как показано ниже.

При двойном щелчке объекта, связанного с обработчиком, вызывается IContextMenu:: куериконтекстмену с флагом КМФ _ дефаултонли , установленным в параметре уфлагс .

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

В следующем примере показаны записи реестра, которые включают обработчик контекстного меню для типа файла МИП. Подраздел CLSID обработчика включает подраздел майчанжедефаултмену , гарантирующий, что обработчик вызывается, когда пользователь дважды щелкает связанный объект.

Реализация интерфейса IContextMenu

IContextMenu является самым мощным, но и самым сложным методом для реализации. Настоятельно рекомендуется реализовать команду с помощью одного из статических методов глагола. Дополнительные сведения см. в разделе Выбор статической или динамической команды для контекстного меню. IContextMenu содержит три метода: жеткоммандстринг, инвокекомманд и куериконтекстмену, которые подробно обсуждаются.

Метод IContextMenu:: Жеткоммандстринг

Метод IContextMenu:: жеткоммандстринг обработчика используется для возврата канонического имени для команды. Этот метод является необязательным. В Windows XP и более ранних версиях Windows, когда в проводнике Windows есть строка состояния, этот метод используется для получения текста справки, который отображается в строке состояния для пункта меню.

Параметр идкмд содержит смещение идентификатора команды, которая была определена при вызове IContextMenu:: куериконтекстмену . При запросе строки справки для уфлагс будет задано значение GC _ хелптекств. Скопируйте строку справки в буфер pszName , приведя ее к пвстр. Строка команды запрашивается путем установки уфлагс в GC _ вербв. Скопируйте соответствующую строку в pszName, точно так же, как и строку справки. Флаги валидатев GC _ и GC _ не используются обработчиками контекстного меню.

В следующем примере показана простая реализация IContextMenu:: жеткоммандстринг , которая соответствует примеру IContextMenu:: куериконтекстмену , приведенному в разделе метод IContextMenu:: куериконтекстмену этой статьи. Поскольку обработчик добавляет только один пункт меню, можно вернуть только один набор строк. Метод проверяет, является ли идкмд допустимым, и, если это так, возвращает запрошенную строку.

Функция стрингкчкопи используется для копирования запрашиваемой строки в pszName , чтобы гарантировать, что копируемая строка не превысит размер буфера, указанного в кчнаме. В этом примере реализована поддержка только значений Юникода для уфлагс, поскольку только они использовались в проводнике Windows с момента выпуска Windows 2000.

Метод IContextMenu:: Инвокекомманд

Этот метод вызывается, когда пользователь щелкает элемент меню, чтобы указать обработчику выполнить связанную команду. Параметр пиЦи указывает на структуру, содержащую необходимую информацию.

Хотя пиЦи объявляется в шлобж. h как структура кминвокекоммандинфо , на практике он часто указывает на структуру кминвокекоммандинфоекс . Эта структура является расширенной версией кминвокекоммандинфо и содержит несколько дополнительных членов, которые позволяют передавать строки в Юникоде.

Проверьте член кбсизе объекта пиЦи , чтобы определить, какая структура была передана. Если это структура кминвокекоммандинфоекс , а у члена фмаск установлен флаг _ _ Юникода Mask , приведите пиЦи к кминвокекоммандинфоекс. Это позволяет приложению использовать сведения в Юникоде, содержащиеся в последних пяти элементах структуры.

Читайте также:  Поменять домашнюю директорию пользователя linux

Элемент лпверб или лпвербв структуры используется для задания выполняемой команды. Команды идентифицируются одним из следующих двух способов.

  • В строке команд команды
  • По смещению идентификатора команды

Чтобы отличить эти два варианта, проверьте, что в регистре Юникода или лпвербв используется слово высокого порядка ЛПВЕРБ для регистра ANSI. Если слово с высоким порядком не равно нулю, лпверб или лпвербв содержит строку команды. Если слово с высоким порядковым значением равно нулю, то смещение команды находится в слове лпверб нижнего порядка.

В следующем примере показана простая реализация IContextMenu:: инвокекомманд , которая соответствует примерам IContextMenu:: куериконтекстмену и IContextMenu:: жеткоммандстринг , заданным до и после этого раздела. Сначала метод определяет, какая структура передается. Затем он определяет, определена ли команда по смещению или ее команде. Если лпверб или лпвербв содержит допустимую глагол или смещение, метод отображает окно сообщения.

Метод IContextMenu:: Куериконтекстмену

Оболочка вызывает IContextMenu:: куериконтекстмену , чтобы обработчик контекстного меню добавим в меню соответствующие элементы меню. Он передает маркер HMENU в параметре HMENU . Для параметра индексмену задается индекс, используемый для первого добавляемого элемента меню.

Все элементы меню, добавленные обработчиком, должны иметь идентификаторы, попадающие в значения параметров идкмдфирст и идкмдласт . Как правило, первый идентификатор команды имеет значение идкмдфирст, что увеличивается на единицу (1) для каждой дополнительной команды. Такой подход позволяет избежать превышения идкмдласт и максимально увеличить количество доступных идентификаторов в случае, если оболочка вызывает более одного обработчика.

Смещение команды идентификатора элемента — это разница между идентификатором и значением в идкмдфирст. Сохраните смещение каждого элемента, добавляемого обработчиком, в контекстное меню, так как оболочка может использовать его для обнаружения элемента, если впоследствии вызывает IContextMenu:: жеткоммандстринг или IContextMenu:: инвокекомманд.

Необходимо также назначить команду каждой добавляемой команде. Глагол — это строка, которую можно использовать вместо смещения для обнаружения команды при вызове IContextMenu:: инвокекомманд . Он также используется такими функциями, как ShellExecuteEx для выполнения команд контекстного меню.

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

Flag Описание
КМФ _ дефаултонли Пользователь выбрал команду по умолчанию, обычно дважды щелкнув объект. IContextMenu:: куериконтекстмену должен возвращать управление в оболочку без изменения меню.
КМФ _ по умолчанию Ни один элемент в меню не должен быть элементом по умолчанию. Метод должен добавить в меню свои команды.
КМФ, _ Обычная Контекстное меню будет отображаться в обычном режиме. Метод должен добавить в меню свои команды.

Чтобы добавить пункты меню в список, используйте инсертмену или инсертменуитем . Затем возвращается значение HRESULT с уровнем серьезности » _ успешно«. В качестве значения кода задайте смещение самого крупного идентификатора команды, который был назначен, плюс один (1). Например, предположим, что идкмдфирст имеет значение 5, и в меню добавляются три элемента с идентификаторами команд 5, 7 и 8. Возвращаемое значение должно быть MAKE_HRESULT(SEVERITY_SUCCESS, 0, 8 — 5 + 1) .

В следующем примере показана простая реализация IContextMenu:: куериконтекстмену , которая вставляет одну команду. Смещение идентификатора для команды равно _ отображению IDM, для которого задано значение 0. Переменные m _ псзверб и m _ пвсзверб являются частными переменными, которые используются для хранения связанной с ними независимой от языка строки в форматах ANSI и Unicode.

Сведения о других задачах реализации команд см. в разделе Создание обработчиков контекстного меню.

Оцените статью