Я подозреваю, что то, чего вы пытаетесь достичь, более или менее невозможно из-за того, как спроектирована система меню в Windows.
Обратите внимание, что могут быть некоторые нетрадиционные способы решения этой проблемы, однако я сомневаюсь, что вы найдете такое решение, выполняющее меньший объем работы, чем ваша текущая стратегия обхода иерархии меню.
Дело в том, что иерархия меню и подменю на самом деле представляет собой дерево обычных меню. В MFC у вас есть дерево объектов CMenu, а в Win32 C api это дерево дескрипторов HMENU.
Каждое меню, независимо от того, является ли оно подменю или главным меню, содержит ряд элементов, которые сами по себе не являются объектами. Т.е. нет класса MFC с именем CMenuItem и нет типа дескриптора Win32 API с именем HMENUITEM. Если вы посмотрите на любую функцию, имеющую дело с меню, она всегда связана с передачей идентификатора пункта меню. Например, посмотрите CMenu :: EnableMenuItem или CMenu :: GetDefaultItem.
Теперь настоящая проблема состоит из двух фактов: пункты меню являются локальными по отношению к меню, в котором они расположены. Если вы посмотрите на любую функцию в C API, вам всегда нужно указать как дескриптор меню, так и идентификатор пункта меню, поскольку тот факт, что идентификаторы элементов не могут быть разрешены, если фреймворк не знает, о каком объекте меню вы говорите. Следовательно, идентификаторы не являются глобальными. В MFC обычно не требуется указывать дескриптор меню, но это, конечно, потому, что сам объект CMenu является оболочкой для дескриптора HMENU.
Вторая часть проблемы заключается в том, что нет естественного способа получить меню (CMenu или HMENU) из позиции. Вы можете получить элемент меню с позиции через MenuItemFromPoint, но, как видите, вам также понадобится дескриптор меню, а возвращаемый идентификатор действителен только в сочетании с указанным вами дескриптором меню. Поскольку вы не можете получить этот дескриптор меню никаким другим способом, кроме обхода иерархии подменю, вы вернулись к исходной точке.
В заключение - возможности меню Visual C ++ (CMenu) всегда ограничены возможностями Функции меню Win32 C API, поэтому любые функции, которые там не обнаружены, более или менее недоступны.
person
sharkin
schedule
07.06.2011