Что такое код getsubmenu


584 — CMenu::GetSubMenu / MFC Справка / Visual C++

Шаг 584 — CMenu::GetSubMenu

Возвращаемое значение
Указатель на объект CMenu, чей m_hMenu член содержит дескриптор к всплывающему меню если всплывающее меню существует в данной позиции, иначе NULL. Если объект CMenu не существует, то временный создан. CMenu возвращенный указатель не должен быть сохранен.

Параметры
nPos
Определяет позицию всплывающего меню содержащегося в меню. Позиция оценивает начало в 0 для первого пункта меню. Идентификатор всплывающего меню не может использоваться в этой функции.

Замечания
Получает объект CMenu всплывающего меню.

GetMenuItemInfo не устанавливает fType с MIIM_TYPE

Я немного поработал с winapi, создавая проект, в котором владелец использовал меню. Когда я позвонил GetMenuItemInfo , он устанавливает текст пункта меню, но не флаги переменной UINT fType.
В настоящее время я заявил:

Я не знаю, запутался ли я с флагом MIIM_TYPE.

Я вставляю меню с InsertMenu функция:

Точно, почему GetMenuItemInfo не восстанавливает fType?

Решение

Если вы проверяли код возврата от GetMenuItemInfo вы бы увидели, что это терпит неудачу. Ваша ошибка в этой строке:

MENUITEMINFO::cbSize элемент должен быть установлен в размере MENUITEMINFO структура, но вы устанавливаете его в размере MENUITEMINFO* указатель (то есть 4 или 8 байтов, в зависимости от платформы).

Измените свой код на:

Кроме того, ваш код выделяет MenuItem вне цикла, а также один раз за итерацию внутри цикла, так что вы теряете память.

Другие решения

Хорошо. Проблема не в синтаксисе и не в размере памяти.
Это больше похоже на «логическую» ошибку и глупую ошибку.

ModifyMenu менял все пункты меню и
установив fType каждого из них в NULL или установив MF_SEPARATOR для всех элементов.

Это произошло потому, что четвертый аргумент ModifyMenu должен быть идентификатор пункта меню, я объявил его как 0.

Я изменил этот аргумент на реальный идентификатор пункта меню, используя GetMenuItemID возвращаемое значение внутри uId_menuitem переменная и передавая ее четвертому аргументу ModifyMenu , Это решило проблему.

Немогу получить доступ к меню другой программы

18.08.2010, 13:42

Получить данные из другой программы из поля TVirtualDrawTree
Хочу получить список контактов из QIP до TVirtualDrawTree добраться то можно, а вот как все.

получить доступ к компонентам другой программы
есть программа написанная на VCL, мне нужно из моей программы считывать данные с компонента.

Получить доступ к компонентам другой формы
Доброго дня! Столкнулся с небольшой проблемой. При вызове модальной формы, пытаюсь получить доступ.

Получить доступ к ComboBox другой формы
Доброго всем. Есть у меня 2 формы -Form1 и Form 2. Form2 имеет свойство FormBorderStyle как.

Получить доступ обьекта из другой формы
Доброго времени суток дорогие программеры. Есть главное окно MainWindow, и второе окно Dialog; .

18.08.2010, 13:59 2 18.08.2010, 14:21 [ТС] 3 18.08.2010, 15:10 4

FindComponentEx во первых,это не стандартная и не API функция,а пользовательская. Вот она

Во вторых,Меню,это не компонент как таковой.Его не найти FindWindowEx,или EnumChild. Функции для работы с меню таковы:

GetMenu(hWnd: HWND): HMENU; — функция вызвращает дескриптор меню.
hWnd -хендл окна,с меню которого будем работать.

GetSubMenu(hMenu: HMENU; nPos: Integer): HMENU; — возвращает описатель подменю
hMenu -Идентификатоp меню.
nPos — Положение элемента меню в hMenu.

GetMenuItemID(hMenu: HMENU; nPos: Integer): UINT; извлекает идентификатор пункта меню размещенного в заданной позиции в меню.
hMenu -Дескриптор меню содержащий пункт, идентификатор которого должен извлечься.
nPos -Устанавливает отсчитываемую от нуля относительную позицию пункта меню, идентификатор которого должен извлечься.

Для нажатия на пунк меню ты должен оправить сообщение окну, где:
Msg = WM_COMMAND
wParam = ID пункта меню
lParam = 0
Пример сообщения:

В качестве примера,во вложении возьми программу,которая нажимает на меню в блокноте. если оставить значения текстовых полей по умолчанию,то в блокноте будет нажат пункт меню «о программе»,поизменяй значения,и узнаешь что да как.

Моя реализация пользовательского меню. Адекватен ли такой код?)

Причина по которой я сделал так, это возможность в перспективе легко добавлять вложенные друг в друга пункты меню, тем самым разбивая функционал программы по категориям. Это моя первая программа, пишу для себя. У меня все работает нормально. Меня беспокоит вот что. Хотелось бы сделать правильно. Многоуровневое меню есть почти в любой игре, почти во всех программах, папки виндоус и линукс реализуют неограниченную вложенность. Но я не нашел нигде как это правильно реализовать. Написал сам.

Илон Маск рекомендует:  Что такое код sqrt

Итак.. Есть class Menu объекты этого класса и будут пунктами меню. Одно из полей этого класса содержит массив указателей на такие же объекты Menu **pItem . Очевидные поля и методы описывать не буду. Есть также поле MenuType type . Это переменная enum , где . Она отвечает за тип пункта меню. Тип отвечает за пользовательский интерфейс внутри различных пунктов меню. Позднее будет понятно. Далее в main() это все собирается:

Затем они помещаются друг в друга:

А дальше вызывается функция вызова меню для первого объекта

В ней сама реализация:

Плюс такой схемы в том, что не нужно заморачиваться с навигацией по вновь добавленным вложенным пунктам. Достаточно создать объект и вложить в другой. Минус в том что приходится рекурсивно передавать много параметров через функцию show_Menu() : структуры данных, флаги меню и т. д. Это выглядит странно, потому закрались сомнения. Подскажите, пожалуйста, есть ли другое решение? И скиньте ссылку, если уже видели где-то лучший вариант.

wp_get_nav_menu_items() WP 3.0

Получает элементы меню навигации в виде массива, который затем можно обработать.

Возвращает все элементы (ссылки) указанного меню навигации, которое создается в панели: Внешний вид > Меню .

Передав название, ID или слаг меню, функция получит элементы меню навигации.

Хуки из функции
Возвращает

Массив/false. Массив данных о ссылках. False, когда меню нет.

Шаблон использования

Использование

Аргументы в виде массива, которые формируют выводимые данные.

$order (строка)
Направление сортировки: ASC или DESC . Это параметр сортировки для запроса get_posts().
По умолчанию: ‘ASC’

$orderby (строка)
Поле по которому сортировать. Это параметр для запроса get_posts().
Дополнительное поле по которому сортировать также можно указать в параметре ‘output_key’ . Подробнее читайте в параметре $output_key .
По умолчанию: ‘menu_order’

$output (строка)
В каком виде нужно получить элементы.

При ARRAY_A к каждому элементу меню (объекту) добавиться еще одно свойство (поле сортировки). Название добавляемого свойства указывается в параметре $output_key . В значении нового свойства будет число — порядковый номер элемента меню. Также элементы меню будут отсортированы с помощью функции wp_list_sort() по полю $output_key с направлением ASC.

Другими словами, при ARRAY_A , элементы меню сортируются отдельно, через функцию wp_list_sort(), по полю $output_key с направлением ASC. И порядковый номер элемента меню добавляется в объект элемента в новое свойство $item->$output_key
По умолчанию: ARRAY_A

$output_key (строка)
Ключ (поле) по которому сортировать элементы меню. Этот ключ не используется в get_posts() , а работает только в этой функции.
По умолчанию: ‘menu_order’

$post_type (строка)
Тип записи, в котором сохраняются элементы меню.
По умолчанию: ‘nav_menu_item’

$post_status (строка)
Статус записи, в которой сохраняются элементы меню.
По умолчанию: ‘publish’

  • $nopaging(true/false)
    Извлекать ли все пункты меню (true) или разбивать на страницы (false).
    По умолчанию: true
  • По умолчанию: дефолтные параметры

    Примеры

    #1. Пример построения простого списка меню

    #2 Какие данные содержит возвращаемый объект

    Не имеет значения какая ссылка добавлена в меню в админке: пост, таксономия или произвольная ссылка. Все они сохраняются в таблице wp_posts c одинаковыми полями (поля меню).

    Многие из полей попросту не нужны и не имеют смысла, потому что относятся к записям. Используйте последние значения начиная с db_id они определяют пункт меню.

    Как получить подменю в MFC?

    Я пытаюсь получить подменю, чтобы внести изменения в него до его отображения.

    Итак, я создал обработчик OnInitMenu() для моего окна. И я планировал использовать pMenu->GetMenuItemInfo() для получения подменю.

    Однако, похоже, это не сработает. Чтобы найти нужное меню, я должен предоставить идентификатор команды меню (я не считаю его удовлетворительным для позиции позиции жесткого кода). Но пункты меню, открывающие подменю, не имеют идентификаторов команд. Я могу получить команду меню, которая существует внутри этого подменю, но тогда у меня все еще нет самого меню.

    Как я могу найти подменю, вложенное в основное меню, не полагаясь на MF_BYPOSITION ?

    Кажется, ответ заключается в том, что вы не можете. Использование идентификаторов команд для поиска команды меню имеет большое значение, поскольку такой код будет продолжать работать при изменении пунктов меню. Однако элементы меню, которые являются подменю, просто не имеют идентификатора команды.

    Один из подходов состоит в том, чтобы иметь известную команду меню, которую вы можете искать по идентификатору, а затем вставлять новые элементы рядом с этой командой. Однако вам все еще нужно содержащее меню.

    Подход, который я использовал в результате изучения кода, используемого MFC для заполнения последнего списка файлов в меню «Файл». Общая методика описана в несколько устаревшем столбце Paul DiLascia Q и A из Microsoft Systems Journal.

    Мое решение этой же проблемы состояло в том, чтобы создать вспомогательную функцию для поиска в меню и вернуть позицию в зависимости от имени меню.

    Что такое код getsubmenu

    Даёт приложению доступ к системному меню окна для копирования и модификации

    Илон Маск рекомендует:  Оптимизация для pentium процессора список инструкций с плавающей точкой

    #include
    _GUICtrlMenu_GetSystemMenu ( $hWnd [, $fRevert = False ])

    $hWnd Дескриптор окна, которое получит копию меню
    $fRevert [необязательный] Определяет действие функции
    False — возвращает дескриптор копии системного меню окна, используемой в данный момент. Создаётся точная копия системного меню, но с возможностью модификации.
    True — сбрасывает системное меню окна по умолчанию. Предыдущая копия системного меню, если имеются, удаляется.

    Возвращает дескриптор копии меню, если $fRevert = False Возвращает 0, если $fRevert = True

    Любое окно, которое не использует функцию GetSystemMenu для создания собственной копии системного меню, получает стандартное системное меню окна. Системное меню окна изначально содержит системные пункты меню с различными идентификаторами, такие как $SC_CLOSE , $SC_MOVE и $SC_SIZE . Системные пункты меню высылают сообщения $WM_SYSCOMMAND . Все встроенные системные пункты имеют идентификатор в виде числа, большего чем 0xF000. Если приложение добавляет команды в системное меню окна, то необходимо использовать идентификатор в виде числа, меньшего чем 0xF000. Система автоматически делает серыми пункты системного меню окна, в зависимости от ситуации. Приложение может выполнить собственную проверку или сделать серыми пункты, реагируя на сообщение $WM_INITMENU , которое высылается до того как отобразить меню.

    Искать GetSystemMenu в библиотеке MSDN

    Func _Main ()
    Local $hWnd , $hMenu , $iCount , $iI

    ; Вставляет пункт в системное меню
    _GUICtrlMenu_InsertMenuItem ( $hMenu , 5 , ‘Элемент вставленный’ )

    ; Отображает системное меню
    $iCount = _GUICtrlMenu_GetItemCount ( $hMenu )
    Writeln ( $hWnd , «Дескриптор системного меню: 0x» & Hex ( $hMenu ))
    Writeln ( $hWnd , «Количество пунктов . » & $iCount )
    For $iI = 0 To $iCount — 1
    Writeln ( $hWnd , «Пункт » & $iI & » текста . » & _GUICtrlMenu_GetItemText ( $hMenu , $iI ))
    Next

    ; Записывает строку текста в блокнот
    Func Writeln ( $hWnd , $sText )
    ControlSend ( $hWnd , «» , «Edit1» , $sText & @CR )
    EndFunc ;==>Writeln

    Что такое код getsubmenu

    Есть некое приложение. Необходимо автоматизировать очень часто выполняемую операцию. Так как приложение не поддерживает никаких макросов, то приходится управлять им на уровне WinAPI. Одно из действий, которое необходимо выполнить, заключается в эмуляции выхова одного из пунктов меню. Аналогично тому, чтобы щелкнуть в блокноте «Файл\Открыть». Но в отличии от блокнота приложение не использует «горячие клавиши».

    Конечно можно просто послать приложению комвинацию клавиш: «ALT»->»Стрелка вниз»->»Стрелка вниз»->»Enter», но по-моему этого является далеко не лучшем решением проблемы.

    WM_COMMAND
    wNotifyCode = HIWORD(wParam); // notification code
    w >hwndCtl = (HWND) lParam; // handle of control

    Прочитал справку по этим сообщениям и понял, что это как раз то, что мне нужно. Только я никак не могу понять как пользоваться ими? Как узнать этот самый wID?


    > этого является далеко не лучшем решением проблемы

    да, разумная мысль.

    такой подход м.б. оправдан (ибо будет чуть ли единственно возможным) лишь в случае «рисованого меню» и невозможности инф.обмена с целевым приложением как с олей/СОМ-сервером автоматизации


    > Как узнать этот самый wID?


    > Как узнать этот самый wID?

    Spy++ или WinSight помогают

    Проблема в том, что это не просто меню окна, а панель в стиле OfficeXP. GetMenu и GetSubMenu не работают =(

    Так работает:
    var
    Men:HMenu;
    idMen:integer;
    begin
    WWND:=FindWindow(nil,»Безымянный — Блокнот»);
    Men:=GetMenu(WWND);
    Men:=GetSubMenu(Men,0);
    >if idMen<>0 then PostMessage(WWND,WM_COMMAND,idMen,0);
    end;

    Но если вместо «Безымянный — Блокнот» написать «Документ1 — Microsoft Word», то уже не работает =( Т.е. GetMenu не работает с меню типа OfficeXP. Как можно поступить аналогично в этом случае?


    > GetMenu не работает с меню типа OfficeXP

    присоединяюсь к вопросу, примерно такие-же грабли, только с эксплорером-)

    Мастера! Очень надеюсь на вашу помощь! Уже часа 4 ломаю голову над этой проблемой. решение все ещё не найдено :(((

    1. У этих приложений нет меню.
    2. Оно заменяется как правило тулбаром ( >

    Как класс пишет «Afx:00400000:8:00010011:00000000:00000000»
    Получить HWND этого ToolBar»a не проблема. Проблема в том, чтобы эмулировать вызов элемента меню из подменю этого ToolBar»a

    Насколько я понимаю самый простой вариант описан в первом посте.
    «ALT»->»Стрелка вниз»->»Стрелка вниз»->»Enter» :(
    Не хотелось бы делать так.

    1. Определи на какое сообщение сам тулбар откликается. Искать следует среди сообщений TBM_*. Это позволит получить все его кнопки, и даже возможно их текст.
    2. Закрепленные подменю у кнопок могут и отстутствовать — они могут показываться динамически по WM_CONTEXTMENU на кнопке.

    Поправка — сообщения начинаюся с TB_, например TB_GETBUTTONTEXT

    Что такое Отправить API для доступа к командам меню из внешнего приложения

    есть ли отправить апи для доступа к меню команды в другом приложении? Например, я пытаюсь получить доступ к меню Вид из блокнота. Как я буду это делать? Я уже получил меню с помощью GetSystemMenu, но я не могу получить доступ к нему. Я думаю, что это имеет API уже, но я не знаю.

    Следующий код в Python активизирует пункт меню Bar View / Status. Вы не должны иметь никаких проблем , преобразовав его в Delphi , как это выглядит псевдокод в любом случае. Он выбирает пункты меню четвёртого через ( «View») и 1 — й пункт вниз ( «Status Bar»). Если вы хотите, вы можете изменить его для поиска нужного элемента в виде текста, идя по пунктам и использование GetMenuString . Смотрите MSDN для деталей.

    Илон Маск рекомендует:  Краткое описание процессоров AMD Vishera, отзывы покупателей

    Обратите внимание , что он не делает каких — либо проверки ошибок. Отметим также , что он ожидает , что название Notepad, чтобы быть «Untitled — Notepad. (Вы можете изменить это , чтобы None искать что — нибудь, я думаю , что было бы nil в Delphi.)

    А вот некоторые Delphi код.
    Имейте в виде , что это не будет работать , если вы не имеете истинное меню.
    С помощью: «GetMenu не работает на плавающей панели меню Плавающие панели меню пользовательские элементы управления , которые имитируют стандартные меню, они не меню , чтобы получить ручку на панели плавающем меню, используйте активные интерфейсы доступа. »

    Например, он не будет работать с самой Delphi .

    wp_get_nav_menu_object() — возвращает объект меню

    Возможно вы знаете, что каждое созданное меню в WordPress является элементом таксономии nav_menu . Функция wp_get_nav_menu_object() — это ни что иное, как совокупность функций get_term() и get_term_by().

    В случае успеха функция возвращает объект меню, в случае неудачи — логическое false . Вот результат действия кода print_r( wp_get_nav_menu_object( 381 ) ); для моего меню в шапке:

    Теперь перейдем к примерам.

    Как узнать ID меню

    На самом деле тут есть два способа.

    Способ 1. Смотрим исходный код

    Итак, переходим в админке во Внешний вид > Меню, выбираем нужное нам меню, ID которого требуется узнать, затем заходим в исходный код в браузере (в разных браузерах и ОС это делается по-разному, но скорее всего должно помочь нажатие правой кнопкой мыши где-нибудь в теле веб-страницы).

    Открыли код? Теперь ищем невидимое поле с атрибутом name равным menu. Значение атрибута value данного поля и есть ID меню.

    Способ 3. Определяем ID меню по его имени

    Тут уже мы будем использовать функцию wp_get_nav_menu_object() . Допустим, что имя меню у нас «Меню для шапки», тогда:

    Как узнать ярлык меню

    Если известен ID:

    Если известно название меню:

    Как узнать количество элементов в меню

    Понятное дело, можно их подсчитать, но я имею ввиду другое. Как получить данное значение в коде, в виде переменной? Вот так:

    Впервые познакомился с WordPress в 2009 году. С 2014 года меня можно встретить на WordCamp по всему миру — официальной конфе по WordPress, иногда там выступаю, но с 2020 выступаю только на тех, которые сам организовываю. Также периодически школа Epic Skills и LoftSchool приглашают меня вести у них уроки/вебинары.

    Если вам нужна помощь с вашим сайтом или может даже разработка с нуля — пишите мне.

    Комментарии 18

    Здравствуйте Михаил у меня следующий вопрос Возможно ли как то скрыть один из пунктов меню. Типа если пользователь не залогинен он не видит какой то пункт меню? Или надо только с подменной меню полностью делать для зарегистрированных и не для зарегистрированных, а потом условия?

    Здравствуйте, вариантов несколько:

    Условие проверки зарегистрированного пользователя подсказать?

    Да Михаил если можно подскажите, как это можно реализовать через wp_get_nav_menu_items(), ? Скажите Михаил, а вам возможно потом еще один вопрос задать если вы знакомы с api WooCommerce? Просто вы в моих глазах один из ни многих, кто помогает людям с вопросами. А на всяких гламурных форумах ведать «взападло» ответить мега супер челам. Либо просто молчат либо пишут, что то вроде да тут все просто сам не знаешь, что ли. Нет знаю, так просто вопрос задаю. Ну это так полимика. Да и на самом деле информации очень мало стоящей в интернете. Всяких блогов много подобных вашему, но там так один рерайт.
    А Вы я вижу, понимайте, что пишите .

    Спасибо! Если нравится мой блог, буду благодарен, если заюзаете кнопки соц сетей вверху ��

    В общем используйте последний пример тогда с поста про wp_get_nav_menu_items().

    Для того, чтобы проверить, зарегистрирован ли пользователь, используйте условие:

    если подскажете ответ на вопрос то не только заюзаю но и присоеденюсь с радостью

    можно ли так делать на странице и не будет ли поисковик считать что у меня на странице два заголовка х1

    Партнёрам
    Сотрудничать с нами – выгодно
    ну и что произойдёт если вот так сделать

    а то нигде не могу найти ответа

    SEO-профи я себя не считаю, но думаю, что в этом ничего такого.

    Через CSS кстати проще простого будет скрыть, если вам такой способ подойдёт могу подсказать уже сразу готовый код.

    так всё таки это два х1 и что тут делать?

    Если не сложно, то подскажите, а то у меня решение, через jquery только есть я делал, так

    Скажите Михаил, а вам возможно потом еще один вопрос задать если вы знакомы с api WooCommerce?

    C WooComerce как-то давно работал. Сейчас уже всё позабыл ��

    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL