PopupMenu 2

Обсуждение проектов наших жителей.
Вы можете выставить проект на тест или найти помощников для его реализации.

Модератор: BV

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

PopupMenu 2

Сообщение GSerg » 14.04.2004 (Ср) 9:46

Так :)
Друзья, выскажите глубокие мысли по поводу одной проблемы.

Окинул трезвым взглядом свой PopupMenu.ctl, не понравился он мне страшно :) К тому же, при его написании у меня не было Win32.hlp из SDK, а теперь есть, и потому я занялся его (контрола) перелопачиванием. Самое интересное, что получилось и работает. Но маломасштабируемо :) Масштабируемость увеличил, работать перестало :) Знаю где, не знаю почему.

Есть структура MENUITEMINFO. В ней есть элемент dwItemData as long, который мы вольны использовать как хотим. Так я его переобъявил как object и засунул указатель на один весёлый объект (это при создании айтема делается). Получаю я потом эту структуру от винды через WM_НеСутьВажно. Внимание, вопрос: а какого, собственно, при попытке вызова этого объекта недопустимо сворачивается коврик?

Решение данной проблемы откроет перед нами небывалые горизонты работы с меню :) Вплоть до выкладывания исходников в этом топике :)



vbskb_api vbskb_menu vbskb_ownerdraw
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.04.2004 (Ср) 14:53

Челы, сорьте :)
Я тупо простегал :) Я заюзал устаревшую функцию. Заменил её на рекомендуемую мелкософтом, и мой указатель теперь в лучшем виде :) Всё работает. Начинаю доводить до ума.
Не юзайте AppendMenu, потомки! Есть ведь InsertMenuItem :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.04.2004 (Чт) 10:34

Ну, собственно, и вот :)

Для полнофункциональной работы этого проекта нужен мой же SubClasser (соседний топик). Но можно и без него (#const subclasserpresent=false), правда тогда ничего особенного и даже в некотором роде фи :)

Это не проектная группа, они с сабклассером именно единый проект. У меня на харде они так взаимно расположены, что... В общем, Subclasser распакуйте в папку Subclasser, меню - в папку Menu, и эти две папки должны быть на одном уровне, в одной, значит, родительской папке, ну, вы поняли... Ну не хочу жёстко привязывать файлы к проекту, просто subclasser может измениться, поэтому в Menu не копия его файлов, а только ссылка на них :)

Требуется же - заценить и высказаться, как вы, конечно, догадались! Последний пункт особенно важен, ибо скачивают втихую некоторые личности :wink: А как мы будем идти вперёд без квалифицированных отзывов?

Параллельно объявляется конкурс на лучший код для MenuItemDrawer_Paint. Утрём нос контролам в стиле XP! Победителю зелёный смайл и бесплатное право с чувством заслуженной гордости за своё детище поделиться им с нами!


Обновление основных файлов плюс рисовальщик в стиле Офис 97.
Хотя всем пофигу...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 31.08.2004 (Вт) 16:35

Серьёзный апдейт, а потому топик-ап :)

Пока форум был в дауне, некто tyomitch :wink: заинтересовался данным решением... В результате совместного творчества была устранена куча багов, а также добавлена возможность присобачивания меню ещё и к форме (только если у неё NegotiateMenus = False!!!). tyomitch пошёл развивать направление в одну сторону, я в другую, так что выложенное сейчас мною мною же и написано :)
Кроме того, появились новые рисовальщики (это целиком tyomitch). Он их выложит сам, когда обнаружит профпригодность форума.

Ну чё, отзывы-то будут? :)
У вас нет доступа для просмотра вложений в этом сообщении.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.09.2004 (Ср) 7:23

А вот и оно, родимое...

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

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.09.2004 (Ср) 9:04

Как лучший и единственный участник конкурса, ...

tyomitch: :mrgreen: :!: :!: :!:


А я-то думал - как поставить флаг "меню верхнего уровня"? Всё пытался его к самому меню присобачить. Точно, к айтему! :) Систему InfoEx переймём (оставив localalloc, конечно :wink: ).
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.09.2004 (Ср) 9:08

Только знаешь что?

winuser.h писал(а):#define MF_DISABLED 0x00000002L


Так что у меня всё было правильно. Уж исправь :)


Да, и что там за "это нужно сделать руками?". Ничего не нужно, всё прекрасно самоуничтожается :)

ЗЫ: Конструктор InfoEx рулез :)
ЗЗЫ: Почему не внедрил простое решение бага со слетающим меню? Я же тебе вроде присылал :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.09.2004 (Ср) 18:59

GSerg писал(а):Только знаешь что?
winuser.h писал(а):#define MF_DISABLED 0x00000002L

Так что у меня всё было правильно. Уж исправь :)

Без него не засеривается - я проверял.

Вот, кстати, оттуда же:
/* Menu flags for Add/Check/EnableMenuItem() */
#define MFS_GRAYED 0x00000003L
#define MFS_DISABLED MFS_GRAYED


GSerg писал(а):Да, и что там за "это нужно сделать руками?". Ничего не нужно, всё прекрасно самоуничтожается :)

У меня вылазит ошибка в Class_Terminate, на строке "While ItemsCount > 0", потому что GetMenuItemCount вызывается с невалидным (уничтоженным) хэндлом.
[5 минут...]
Хмм... Если задать NegotiateMenus = False, то всё работает. Ну да ладно. Уберу в следующей версии ;-)

GSerg писал(а):ЗЫ: Конструктор InfoEx рулез :)
ЗЗЫ: Почему не внедрил простое решение бага со слетающим меню? Я же тебе вроде присылал :)

Не успел - всё Drawer31 полировал ;-)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.09.2004 (Ср) 19:13

А у меня засеривается!..
И деструкция прходит нормально независимо от NegotiateMenus :roll:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.09.2004 (Ср) 19:52

У тебя WinXP, а у меня Win2000. Может быть, разница из-за этого.
Кроме того, я проверял на Win98 - нашёл жуткий баг. Оказывается, там CallWindowProc(0, ...) рушит прогу. А в Win2000 - спокойно так работает :-)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.09.2004 (Ср) 20:26

А что, у нам там в ноль может вызываться? :?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.09.2004 (Ср) 20:46

Был баг, я нашёл и устранил.

[Оффтопик]
Длительное время я противостоял искушению сделать какую-нибудь сильно остроумную подпись, считая, что это исключительно тупо - увеличивать объём страницы вдвое безо всякой пользы, и что все эти остроумности в первый раз смешные, а в стопервый уже надоедают. Даже обдумывал - а не послать ли модераторам "рацпредложение" отключить подписи и ограничить поле "Откуда" примерно до 10-15 символов, чтобы всякие шурики и красавицы ещё и там своё остроумие не демонстрировали.
Потом я научился фильтровать читаемое и не обращать внимание на всю эту ерунду. Теперь я решил ещё и собственную подпись завести - пусть новички страдают так, как страдал я, пытаясь в куче остроумия найти ответ на свой вопрос.
[/Оффтопик]
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.09.2004 (Ср) 20:52

Вот всё, что между тегами офтопика, в подпись и включи :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.09.2004 (Сб) 23:16

Поддерживаются кастомные отрисовщики неклиентской части меню. Пример использования тут же.
GSerg, твой ход ;-)
У вас нет доступа для просмотра вложений в этом сообщении.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.09.2004 (Вс) 11:54

Да куда ж дальше? :)
Это можно только повторить на моей объектной модели, но никак не превзойти :)

Хотя может всё-таки реализовать тень? Хм... Ищу всегда гемор себе :)
Наверное, нуно будет пойти в сторону интеграции меню с ImageList, дабы, значится, отрисовку делать не только с помощью иконок, но и обычными картинками.

Аааа!!! Там же ещё Drag'n'drop поддерживается! Вот куда я щас пойду...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 13.09.2004 (Пн) 22:51

С первого раза не очень понятно, как отловить клики по каждому из пунктов меню - ведь это главное в меню!
Чую, что нужно где-то вставлять withevents, но пока методом тыка не дошёл.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.09.2004 (Пн) 23:04

Дык есть же событие Click! И SelectionChange есть. И не только :)
Конечно, withevents m as popumenu!

Если не хочешь включать саблассинг, то тогда ID выбранного элемента возвратит тебе метод Show.

Но это что касается моей реализации :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 14.09.2004 (Вт) 0:02

Вроде разобрался с кликами и для PopupMenu, и для Menu.
Осталось усечь, какой минимум требуется, скажем, для меню типа Word

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.09.2004 (Вт) 0:13

Очень просто: #SubclasserPresent = True и подключить Office97Drawer :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.09.2004 (Вт) 0:31

Чё уж там, пусть сразу XPDrawer :-)
Изображение

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 15.09.2004 (Ср) 23:07

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

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.09.2004 (Ср) 23:31

Скажу "никак" - ведь огорчится... :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.09.2004 (Чт) 7:14

Напиши аддин, который будет конвертировать готовое меню в нужный формат. Там ведь всё тривиально, просто возни много.
Изображение


Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

    TopList