Сообщения, используемые меню
Система сообщает о действии связанного меню, отправляя сообщения оконной процедуре окна, которое владеет меню. Система отправляет ряд сообщений, когда пользователь выбирает пункты в строке меню или щелкает правой кнопкой мыши, чтобы показать на экране контекстное меню.
Когда пользователь активизирует пункт горизонтального меню, окно владелец сначала получает сообщение WM_SYSCOMMAND. Это сообщение включает в себя флажок, который указывает, активизировал ли пользователь меню при помощи использования клавиатуры (SC_KEYMENU) или мыши (SC_MOUSEMENU). Для получения дополнительной информации об интерфейсе клавиатуры для меню, см. Клавиатурный доступ к меню.
Затем, перед показом на экране любых меню, система отправляет сообщение WM_INITMENU оконной процедуре так, чтобы прикладная программа могла изменить меню до того, как пользователь увидит их. Система отправляет сообщение WM_INITMENU только один раз для активизации меню.
Когда пользователь указывает на пункт меню, который открывает подменю, система отправляет окну владельцу сообщение WM_INITMENUPOPUP перед отображением на экране подменю. Это сообщение дает прикладной программе возможность изменить подменю прежде, чем оно покажется на экране.
Каждый раз, когда пользователь перемещает выделение от одного пункта меню к другому, система отправляет сообщение WM_MENUSELECT оконной процедуре окна владельца меню. Это сообщение идентифицирует текущий выбранный пункт меню. Многие из прикладных программ предоставляют информационную область внизу своих основных окон и используют это сообщение, чтобы показать на экране дополнительную информацию о выбранном пункте меню.
Когда пользователь выбирает командный пункт из меню, система отправляет оконной процедуре сообщение WM_COMMAND. Младшее слово параметра wParam сообщения WM_COMMAND содержит идентификатор выбранного пункта. Оконная процедура должна проверить идентификатор и обработать сообщение соответственно.
Вы можете сохранить информацию о меню, используя структуру MENUINFO. Если меню определяется со значением MNS_NOTIFYBYPOS члена MENUINFO.dwStyle, система, когда выбирается пункт, отправляет сообщение WM_MENUCOMMAND вместо WM_COMMAND. Это дает возможность обратиться к информации в структуре MENUINFO, а также непосредственно предоставить индекс выбранного пункта .
Не все меню являются доступными через строку меню окна. Многие из прикладных программ показывают на экране контекстное меню, когда пользователь щелкает по правой кнопке мыши в конкретном месте. Такие прикладные программы, если это им свойственно, должны обрабатывать сообщение WM_CONTEXTMENU и показывать на экране контекстное меню. Если прикладная программа не показывает на экране контекстное меню, она должна передать сообщение WM_CONTEXTMENU функции DefWindowProc для обработки по умолчанию.
Сообщение WM_MENURBUTTONUP отправляется тогда, когда пользователь отпускает правую кнопку мыши, пока курсор на пункте меню. Это сообщение предусматривается для того, чтобы приложения могли показать на экране контекстно-зависимое или контекстное меню для пункта меню.
Есть несколько сообщений, которые вызывают только перетаскиваемые меню. Сообщение WM_MENUGETOBJECT отправляется владельцу перетаскиваемого меню, когда курсор мыши входит в пункт меню или перемещается от центра пункта к верху или к низу пункта. Сообщение WM_MENUDRAG посылается тогда, когда пользователь фактически перетаскивает пункт меню.
Когда раскрывающееся меню или подменю разрушаются, система отправляет сообщение WM_UNINITMENUPOPUP.