Окт 16

Поддержка просмотра меню

Пользователи, работающие с Windows-программами, привыкли, что в строке состояния отображается информация о назначении выбранного ими пункта меню. Меню посылает сообщение WM_MENUSELECT, когда пользователь осуществляет навигацию по его пунктам с помощью мыши или клавиатуры. Поэтому для поддержки отображения справочной информации необходимо обрабатывать это сообщение.
Когда оконная процедура получает сообщение WM_MENUSELECT, из его параметров можно извлечь следующую информацию:
Младшее слово параметра wParam содержит идентификатор пункта меню, если это пункт-команда, или индекс подменю (если это пункт-подменю).
Старшее слово параметра wParam содержит один из флагов, характеризующих статус выбранного пункта меню. Из всех возможных флагов сейчас нас будет интересовать только флаг MF_P0PUP, означающий, что данный пункт открывает всплывающее меню или подменю.
Параметр IParam содержит дескриптор меню, которому принадлежит выбранный пункт.
Win32 API содержит функцию MenuHelp, предназначенную для упрощения обработки сообщений WM_MENUSELECT и отображения текста в строке состояния. Технология использования этой функции описана в [1]. Однако, на мой взгляд, зта технология довольно громоздка и неудобна. Здесь предлагается альтернативная технология, в которой функция MenuHelp не применяется.
Ранее мы уже убедились, что бывает очень удобно использовать ресурс таблицы строк при отображении окон подсказок для кнопок панели инструментов. Простота решения базировалась на совпадении идентификаторов кнопок и идентификаторов строк.
Хотелось бы использовать аналогичную идею и для решения рассматриваемой проблемы. Однако если пункты-команды в меню имеют уникальные идентификаторы и мы можем использовать эти же идентификаторы для строк в таблице строк, то с пунктами-подменю ситуация гораздо сложней. В пределах меню каждого уровня пункты-подменю нумеруются начиная с нуля, поэтому ни о какой уникальности не может быть и речи.
Идея решения, предлагаемая здесь, базируется на некоторой договоренности о системе идентификации таких пунктов меню. Сразу уточним, что мы рассматриваем только те меню, которые имеют не более трех уровней. Нулевой уровень — это меню верхнего уровня, подменю в нем имеет первый уровень, а подменю в меню первого уровня получает второй уровень. Большинство Windows-программ удовлетворяет этому ограничению.