При работе меню легко заметить, что не только терминальные пункты, но и пункты-подменю изменяют свой вид до щелчка, когда над ними оказывается курсор мыши. Но сообщение, которое извещает об этой ситуации и может использоваться для вывода подсказки, автору неизвестно. Один из вариантов решения этой проблемы заключается в том, что можно обрабатывать сообщение WM_NCM0USEM0VE с кодом 0x0ОАО или сообщение WM_NCHITTEST с кодом 0x85. Первое сообщение начинает периодически приходить при перемещении курсора за пределами рабочей области окна. Получив его, по значению параметра 1 Pa ram можно определить экранные координаты мыши, а по значению параметра wParam понять, в какой области находится курсор. Если получена константа HTMENU-5, то курсор находится в области меню, константа HTCAPTION-2 указывает, что курсор находится в области заголовка. Для решения задачи потребуется определять координаты прямоугольников, соответствующих пунктам меню, и тестировать позицию курсора на попадание в каждый из этих прямоугольников.
Второе сообщение (WM_NCHITTEST) посылается при щелчках мышью и перемещении курсора как в рабочей, так и в нерабочей области окна. Оно содержит только координаты мыши в lParam, но функция DefWindowProcC) возвращает в ответ на это сообщение точно такие же признаки принадлежности, которые передаются в WMNCM0USEM0VE. Сама система, похоже, пользуется для подсветки пунктов сообщением WMNCHITTEST. Действительно, можно исключить обработку первого сообщения при помощи одной строки кода:
case WMJCMOUSEMOVE: return 0:
В этом случае никаких видимых изменений не произойдет. Сделав то же самое с сообщением WM_NCHITTEST, разработчик полностью утратит взаимодействие с приложением. Не будут работать системное и основное меню, нельзя будет переместить окно или изменить его размеры.
Можно попробовать изменить процесс обработки сообщения WM_NCHITTEST:
case WM_NCHITTEST:
DefWindowProc(hWnd. WM_NCHITTEST. lParam.wParam); return 5; // это константа HTMENU
В этом случае приложение будет считать, что курсор всегда находится в области меню. Поэтому будет работать только меню приложения. То есть получение из оконной функции результата 5 является только причиной выполнения системой проверки на попадание координат курсора в область пункта меню. Рассмотренный пример дает программисту нетрадиционный способ временного запрета доступа пользователя к меню при помощи переменной MenuOff, как показано ниже: