Долго искал тут по форуму, например нашел тему http://www.wasm.ru/forum/viewtopic.php?id=27172 ( http://www.wasm.ru/forum/viewtopic.php?pid=310496#p310496 ). Потом попался на глаза исходничок на VB (ух как много там букв и как мало скобок) http://www.visualbasic.mapscape.ru/sources.html - http://www.visualbasic.mapscape.ru/sources/subclassing_menu.zip Открыл исходник на VB, попробовал сделать то же самое на С. Ну не то же самое, цель у меня другая. Программа вылетает, хотя на глаз вроде то же самое. Цель, как обычно, полный контроль на видом всплывающего меню. С WM_DRAWITEM и WM_MEASUREITEM я уже давно разобрался, но далеко не тот контроль, которого хотелось бы. В приложенном файле во-первых есть попытка использовать класс меню для "подсовывания" своего фона, по факту оно не работает, цвет меняется только в тех пределах, где его можно изменить с помощью WM_DRAWITEM, к тому же не срабатывает при первом запуске, WM_ENTERIDLE вроде как срабатывает после отображения окна. Попытался изменить стиль класса, чтобы поработать над границами окна - ничего не получилось ( SetClassLong ( (HWND)lParam, GCL_STYLE, WM_BORDER ... ), может что-то не так делается, теоретически класс менять после создания окна уже нельзя, но для GCL_HBRBACKGROUND это работает. Вторая мысль отраженная в исходнике, это подмена функции обработки окна, то что обычно работает для любых других окон. Тут приводит к вылету программы (Win2003), хотя пример на VB приведенный выше с теми же сами действиями работает нормально (у меня VB нет, но не думаю, что исходники не совпадают с готовым файлов). В общем цель использовать свой WM_ERASEBKGND и/или WM_PAINT не работает. Почему не пойму.
ntcdm, спасибо. я оттуда взял CMenuXP, в котором применяется технология меняющая стандартное меню(а не создающая свое) через создание хука, который отлавливает создание меню. Но т.к. просто взять целиком и использовать я не могу (и не хочу, без того, чтобы полностью понимать), то получается нужно разобраться. Основную возможность WM_NCPAINT, я смог заставить работать, сделал хук, подменяю процедуру обработки меню, но не могу понять как у них сделана отрисовка пунктов, получается, что придется использовать стандартный ownerdraw, в котором есть минус - надо получить структуру меню, чтобы знать какой текст писать в пунктах, что вполне себе работает с меню загруженным из ресурсов, но не работает с динамически изменяемым меню, т.к. каждый popup имеет свой хэндл. Выход вижу только в дублировании структуры меню своей структурой, т.е. обходить все меню каждый раз при любом изменении, что не очень радует. Ну и все равно интересно, что же такое с WM_ENTERIDLE.
а еще непонятно почему SetClassLong с GCL_HBRBACKGROUND не действует. Еще пробовал GCL_STYLE и он тоже не действует, хотя GCL_WNDPROC вроде как подхватывает.