Создание строки меню Обозреватель в Интернете

На первый взгляд строка меню в Microsoft Internet Обозреватель 5 и более поздних версий выглядит как стандартное меню. Тем не менее, это выглядит совершенно иначе, когда вы начинаете использовать его.

На следующем снимке экрана показана строка меню Windows Internet Обозреватель с выбранным меню "Сервис".

screen shot that shows the windows internet explorer menu bar, with the tools menu selected

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

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

Панель меню может быть включена в элемент управления rebar, предоставляя ему следующие возможности:

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

В этом разделе описывается реализация строки меню. Так как панель меню является специализированной реализацией элемента управления панелью инструментов, фокус будет находиться в разделах, относящихся к строкам меню. Сведения о том, как включить панель инструментов в элемент управления перекладином, см. в статье "Создание панели инструментов в интернете Обозреватель стилей" и "О элементах управления перекладкой".

Создание панели инструментов в строке меню

Чтобы сделать панель инструментов в строке меню, сделайте так:

  • Создайте плоскую панель инструментов, включив ТБSTYLE_FLAT с другими флагами стиля окна. Стиль ТБSTYLE_FLAT также включает горячее отслеживание. В этом стиле строка меню выглядит так же, как стандартное меню, пока пользователь не активирует кнопку. Затем кнопка выделяется на панели инструментов и удручает, когда она нажимается, как стандартная кнопка. Так как функция горячего отслеживания включена, все, что необходимо для активации кнопки, предназначено для наведения курсора на него. Если курсор перемещается на другую кнопку, она будет активирована и отключена старая кнопка.
  • Создайте кнопки стиля списка, включив ТБSTYLE_LIST с другими флагами стиля окна. Этот стиль создает более тонкую кнопку, которая выглядит как стандартный элемент меню верхнего уровня.
  • Сделайте кнопки только текстовыми, задав элемент iBitmap структуры ТБ BUTTON кнопки, чтобы I_IMAGENONE и элемент iString в текст кнопки.
  • Присвойте каждой кнопке стиль BTNS_DROPDOWN . При нажатии кнопки элемент управления панели инструментов отправляет приложению уведомление ТБN_DROPDOWN, чтобы отобразить меню кнопки.
  • Включите строку меню в полосу перекладки. Включите как захваты, так и шевроны, как описано в статье "Создание панели инструментов в стиле Интернета Обозреватель".
  • Реализуйте обработчик ТБN_DROPDOWN для отображения раскрывающегося меню кнопки при нажатии кнопки. Раскрывающееся меню — это тип всплывающего меню. Он создается с помощью функции TrackPopupMenu с его верхним левым углом, выровненным в левом нижнем углу кнопки.
  • Реализуйте навигацию по клавиатуре, чтобы панель меню была полностью доступна без мыши.
  • Реализуйте горячее отслеживание меню. При использовании стандартных меню после отображения меню верхнего уровня перемещение курсора на другой элемент верхнего уровня автоматически отображает его меню и свернет меню предыдущего элемента. Элемент управления панели инструментов будет отслеживать курсор и изменять изображение кнопки, но он автоматически отображает новое меню. Приложение должно сделать это явным образом.

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

Обработка навигации с отключенным режимом горячего отслеживания меню

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

Навигация мыши

Если режим горячего отслеживания меню отключен, можно рассматривать строку меню как обычную панель инструментов. Если пользователь перемещается с помощью мыши, все приложение должно выполнять обработку уведомления ТБN_DROPDOWN. Когда это уведомление получено, отобразите соответствующее раскрывающееся меню и включите горячее отслеживание меню. После этого вы находитесь в режиме горячего отслеживания меню, описанном в разделе "Обработка навигации с поддержкой горячего отслеживания меню".

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

Навигация по клавиатуре

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

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

  • Клавиша F10. Активируйте первую кнопку с ТБ_SETHOTITEM.
  • Клавиши СТРЕЛКА ВЛЕВО и СТРЕЛКА ВПРАВО. Активируйте соседнюю кнопку с помощью ТБ_SETHOTITEM. Если пользователь пытается перейти от любой части строки меню, активируйте первую кнопку в противоположном конце.
  • Клавиша ESCAPE. Отключите активную кнопку с ТБ_SETHOTITEM. Панель меню должна быть возвращена в состояние, которое было до активации первой кнопки.
  • Клавиша акселератора ALT-Key. Используйте сообщение ТБ_MAPACCELERATOR, чтобы определить, какая кнопка соответствует символу ключа. Отображение раскрывающегося меню кнопки и включение горячего отслеживания меню.
  • Клавиша СТРЕЛКА ВНИЗ. Если кнопка активна, но меню не отображается, отобразите меню кнопки и включите горячее отслеживание меню.
  • Клавиша ВВОД. Отключите активную кнопку с ТБ_SETHOTITEM. Панель меню должна быть возвращена в состояние, которое было до активации первой кнопки.

Смешанная навигация

Обработчики навигации клавиатуры, описанные в предыдущем разделе, в основном выполняют две задачи: отслеживайте активную кнопку и отображайте соответствующее меню при выборе кнопки. Эти обработчики достаточно, пока пользователь переходит только с помощью клавиатуры. Однако пользователи часто смешивают навигацию по клавиатуре и мыши. Например, они могут активировать первую кнопку с помощью клавиши F10, использовать мышь для активации другой кнопки, а затем открыть его меню с помощью клавиши СТРЕЛКА ВНИЗ. Если вы нажимаете клавиши мониторинга только для отслеживания активного ключа, отобразится неправильное меню. Кроме того, необходимо обработать уведомление ТБN_HOTITEMCHANGE, чтобы точно отслеживать активную кнопку.

Обработка навигации с поддержкой горячего отслеживания меню

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

С помощью навигации мыши:

  • Если пользователь перемещает курсор на другую кнопку, то это меню сразу появится, а предыдущее меню исчезнет.
  • Меню горячего отслеживания остается активным, пока пользователь не выберет команду или щелкает точку, которая не является частью области меню. Любое действие деактивирует меню горячего отслеживания до нажатия другой кнопки.
  • Если курсор перемещается из меню, текущее раскрывающееся меню остается до тех пор, пока курсор не перейдет обратно, или пользователь щелкает точку за пределами, область, охваченная меню. Если курсор возвращается к другой кнопке, отличной от отображаемой в данный момент, старое меню свернуто и отображается новое меню.

С помощью навигации по клавиатуре:

  • Клавиша СТРЕЛКА ВПРАВО перемещает фокус справа. Если элемент имеет подменю, отобразите подменю. Если элемент не имеет подменю, свернуть меню и любой подменю, активировать следующую кнопку с ТБ_SETHOTITEM и отобразить меню для соседней кнопки. Если последняя кнопка активна при получении этого сообщения, отобразится меню для первой кнопки.

  • Клавиша СТРЕЛКА ВЛЕВО перемещает фокус слева. Если элемент является подменю, свернуть его и переместить фокус в родительское меню. Если элемент не является подменю, свернуть меню, активировать следующую кнопку с ТБ_SETHOTITEM и отобразить меню для этой кнопки.

  • Клавиша ESCAPE поддерживает отображение на одном шаге.

    • Если отображается подменю, он свернут и фокус перемещается в родительское меню.
    • Если отображается меню кнопки, она свернута и отключается горячее отслеживание меню. Кнопка элемента остается активной.
    • Если меню не отображаются, но кнопка активна, кнопка деактивируется и отключается горячее отслеживание меню.
  • Клавиши СТРЕЛКА ВВЕРХ и СТРЕЛКА ВНИЗ используются только для навигации в определенном меню.

  • Клавиша ВВОД запускает команду, связанную с элементом меню. Если элемент меню имеет подменю, то клавишу ВВОД отображает его.

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

Обработка сообщений для горячего отслеживания меню

Для горячего отслеживания меню требуется, чтобы меню отображалось всегда, помимо краткого интервала, необходимого для переключения в новое меню. Однако раскрывающееся меню, отображаемое TrackPopupMenu , является модальным. Приложение будет продолжать получать некоторые сообщения напрямую, включая WM_COMMAND, ТБN_HOTITEMCHANGE и обычные сообщения, связанные с меню, такие как WM_MENUSELECT. Однако он не будет получать сообщения с низкоуровневой клавиатурой или мышью напрямую. Чтобы обрабатывать такие сообщения, как WM_MOUSEMOVE, необходимо задать перехватчик сообщений, чтобы перехватывать сообщения, направленные в меню.

При отображении раскрывающегося меню задайте перехватчик сообщения, вызвав функцию SetWindowsHookEx с параметром idHook , равным WH_MSGFILTER. Все сообщения, предназначенные для меню, будут переданы в MessageProc. Например, следующий фрагмент кода задает перехватчик сообщения, который будет перехватывать сообщения, которые собираются в раскрывающееся меню. MsgHook — имя процедуры перехватчика и hhookMsg дескриптор процедуры.

hhookMsg = SetWindowsHookEx(WH_MSGFILTER, MsgHook, HINST_THISDLL, 0);

Сообщения меню определяются путем задания параметра nCode процедуры перехватчика для MSGF_MENU. Параметр lParam указывает на структуру MSG с сообщением. Сведения о том, какие сообщения необходимо обрабатывать, и как они рассматриваются в оставшейся части этого раздела.

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

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

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

UnhookWindowsHookEx(hhookMsg);

Навигация мыши

Когда обычный элемент управления панелью инструментов включает кнопку "Горячие дорожки", она выделяет активную кнопку и отправляет приложению уведомление ТБN_HOTITEMCHANGE при каждом активации новой кнопки. Приложение отвечает за отображение соответствующего раскрывающегося меню. Оно должно:

  • Обработайте уведомление ТБN_HOTITEMCHANGE для отслеживания активной кнопки. При изменении активной кнопки свернуть старое меню и создать новую.
  • Обработайте уведомление ТБN_DROPDOWN, которое отправляется при нажатии кнопки. Затем он должен свернуть меню и отключить горячее отслеживание меню. Кнопка остается активной.
  • Обработайте WM_LBUTTONDOWN, WM_RBUTTONDOWN и WM_MOUSEMOVE сообщения в процедуре перехватчика сообщений, чтобы отслеживать положение мыши. Если мышь щелкается за пределами области меню, свернуть текущее раскрывающееся меню, деактивировать меню горячего отслеживания и вернуть строку меню в состояние предварительной активации.
  • При запуске команды меню отключите горячее отслеживание меню. Меню будет свернуто автоматически, но необходимо явно освободить перехватчик сообщения.

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

Навигация по клавиатуре

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

  • Клавиша ESCAPE. Клавиша ESCAPE поддерживает отображение на одном уровне. Если отображается подменю, его необходимо свернуть. Если основное меню кнопки отображается, свернуть его и отключить горячее отслеживание меню. Кнопка остается активной.
  • Клавиша СТРЕЛКА ВПРАВО. Если элемент имеет подменю, отобразите его. Если элемент не имеет подменю, свернуть меню и любой подменю, активировать следующую кнопку с ТБ_SETHOTITEM и отобразить его меню. Если последняя кнопка была активна при получении этого уведомления, отобразится меню для первой кнопки.
  • Клавиша СТРЕЛКА ВЛЕВО. Если элемент находится в подменю, свернуть его и переместить фокус в родительское меню. Если элемент не является подменю, свернуть меню, активировать соседнюю кнопку с ТБ_SETHOTITEM и отобразить его меню. Если первая кнопка была активна при получении этого уведомления, отобразится меню для последней кнопки.
  • Клавиши СТРЕЛКА ВВЕРХ и СТРЕЛКА ВНИЗ. Эти ключи используются для перехода в меню, но не влияют непосредственно на горячее отслеживание меню.
  • Клавиша акселератора ALT-Key. Используйте сообщение ТБ_MAPACCELERATOR, чтобы определить, какая кнопка соответствует символу ключа. Если она соответствует другой кнопке, отличной от активной, свернуть текущее раскрывающееся меню, активировать новую кнопку с ТБ_SETHOTITEM и отобразить меню для соседней кнопки. Если символ ключа соответствует отображаемой в данный момент кнопке, свернуть раскрывающееся меню и отключить горячее отслеживание меню. Кнопка должна оставаться активной.