Пользовательская граница меню в чистом Win32 C++ (без WTL, MFC и т. д.)

Используя только Win32 C++ (без WTL, MFC или любой другой сторонней библиотеки), как я могу получить настраиваемые границы меню?

Мне удалось отрисовать элементы, но границы находятся в области «Не клиент», и я не смог найти способ их изменить.

Есть ли способ?


person AP.    schedule 27.12.2013    source источник
comment
Что ж, вы всегда можете переопределить WM_NCPAINT или создать окно без рамки, хотя, возможно, вы могли бы более подробно описать, чего вы пытаетесь достичь?   -  person doynax    schedule 27.12.2013
comment
меню, созданное с помощью CreatePopup/TrackPopupMenu, я не знаю, как его изменить.   -  person AP.    schedule 27.12.2013
comment
Используя нарисованное владельцем меню, вы можете настроить внешний вид предметов. Нарисованные владельцем границы системой не поддерживаются. Вам придется создать собственное окно и заново реализовать всю логику меню. В качестве отступления: ни MFC, ни WTL не позволяют вам рисовать границу меню владельцем.   -  person IInspectable    schedule 28.12.2013
comment
Вы подтверждаете мои опасения..   -  person AP.    schedule 28.12.2013


Ответы (1)


Независимо от того, как вы это реализуете, это будет что-то вроде взлома.

Один из вариантов — забыть о HMENU и создать собственное меню с пользовательским окном «всегда поверх». Это, вероятно, слишком много работы, и вы никогда не сделаете все идеально. Сразу приходит в голову, что вам приходится иметь дело с LTR и RTL, доступностью, настраиваемыми параметрами, такими как тень и анимация меню (скольжение/затухание). Вероятно, есть вещи, которые SetMenu делает с HWND, которые вы не можете воспроизвести с помощью подобного взлома, но вы можете обойти эту проблему, реализация в арматурном стержне.

Если вы хотите продолжать использовать HMENU, вам нужно использовать SetWindowsHookEx, чтобы найти меню HWND. Класс меню: #32768. Затем вы можете подкласс окна и переопределить сообщения WM_NC* и WM_PRINT*. Эта статья Codeproject также содержит информацию о недокументированном сообщении (0x01e5), которое необходимо обработать.

person Anders    schedule 01.01.2017