Сообщение WM_SYSCOMMAND, требующее создания окна подменю, можно породить щелчком на подменю или «горячей» клавишей. При щелчке мышью на подменю параметр wParam содержит константу SC_MOUSEMENU, a lParam - координаты мыши. Если вызвать подменю «горячей» клавишей, то значение wParam будет равно SC_KEYMENU.
В обоих случаях операционная система Windows посылает сообщение WM_SYS-C0MMAND, но принятие решения о необходимости отображения подменю оставляет за приложением. В нашем примере сообщение WM_SYSCOMMAND не обрабатывается, следовательно, его получит DefWindowProc(). Эта функция и выведет подменю.
Если оконная функция, получив WM_SYSCOMMAND, не вызовет функцию Def-WindowProc(), то подменю не будет отображено. Вывести подменю можно и принудительно, если в любом месте программы вызвать DefWindowProc(), передав ей WMJYSCOMMAND.
Порядок обмена сообщениями при работе с меню
О WM_ENTERMENULOOP. Окно подменю является модальным. Начиная с момента его активации, все последующие сообщения от клавиатуры и мыши поступают в диалоговое окно подменю. Подменю извещает об этом приложение, передав оконной процедуре приложения сообщение WM_ENTERMENULOOP. Обратите внимание, что оконная процедура приложения, не завершившись, вызывается заново для получения WMENTERMENULOOP и последующих сообщений. После этого процедура меню будет вызывать оконную процедуру приложения, передавая ей последовательно следующие сообщения.
О WM_INITMENU. Приложение извещается о начале работы с меню, а в lParam хранится дескриптор этого меню.
О WM_MENUSELECT. Это сообщение посылается в оконную функцию несколько раз. Оно возникает при щелчке на подменю и при перемещении курсора на очередной терминальный пункт. Таким образом, WM_MENUSELECT не позволяет выявить факт перевода курсора на нетерминальные пункты File Work.
Параметры этого сообщения позволяют получать дополнительную информацию:
LOWORD(wParam) - идентификатор выделенного пункта, если пункт терминальный, или номер его позиции в меню, если пункт является подменю.