Как сделать меню видимым после нажатия на него? - PullRequest
3 голосов
/ 04 мая 2010

Я использую Delphi. У меня готово всплывающее меню, и в подменю я хочу щелкнуть, но я не хочу, чтобы всплывающее меню исчезало. Я хочу щелкнуть и оставить все как есть.

Ответы [ 2 ]

2 голосов
/ 05 мая 2010

Легко, отключите элемент.


Шутка в сторону, задача не из легких.

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

Но если ваше требование точно такое же, как указано в вашем вопросе (щелкните элемент, и меню не закрывается - щелкните снаружи, и оно закрывается), при некоторой работе это будет возможно.


Ваша цель - подкласс окно, в котором будет находиться ваше подменю, чтобы переопределить некоторую обработку сообщений. Во-первых, выведите новый класс из TPopupList и переопределите его WndProc. Вот пример , делающий это.

Если вы намерены предотвратить закрытие меню, выбрав корневые элементы, то в WndProc PopupList вы обработаете WM_ENTERIDLE и получите дескриптор окна всплывающего меню из lParam сообщения и создадите подкласс окна всплывающего меню.

Если вы намереваетесь предотвратить закрытие меню только путем выбора элементов подменю, то в WndProc PopupList вы будете следить за сообщениями WM_INITMENUPOPUP, где wParam - это не дескриптор самого PopupMenu, это будет означать, что подменю собирается быть показано. Только тогда вы обработаете WM_ENTERIDLE и получите дескриптор окна, в котором находится подменю, и создадите подкласс этого окна.

После создания подкласса окна, в котором находится всплывающее меню или всплывающее подменю, вы перехватите недокументированное сообщение «MN_BUTTONDOWN» ($ 01ED) и предотвратите дальнейшую обработку (не вызывая процедуру исходного окна). Возможно, вы также захотите предотвратить закрытие меню с помощью клавиатуры; вы будете следить за сообщениями WM_KEYDOWN (Enter) и WM_CHAR (ускоритель).

Ну, я бы подумал.

1 голос
/ 04 мая 2010

Я не знаю, как вы можете это сделать, но компонент TAdvStickyPopupMenu (программное обеспечение TMS) может это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...