![]() |
Модераторы: Akina |
![]() ![]() ![]() |
|
ZLon |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.5.2007 Репутация: 3 Всего: 3 |
Проблема возникла из следующего:
Захотелось мне приукрасить меню пиктограммами через API функции. Действовал через SetMenuItemInfo с флагом MIIM_BITMAP, и грузил растры в нужные меню и их пункты. Заметил, что когда пункт меню выделен, то его растр инвертируется, что конечно неприемлемо. Пришлось ставить хук на месаги от меню и ловить сообщения WM_MENUSELECT и переопределять растр для пункта меню на инверсный, а для предыдущего пункта возвращать нормальный растр. Таким образом две инверсии при выделении пункта меню давали нужный результат. "Ура!",- воскликнул я, получилось прямо как в системном меню "открыть с помощью", но не тут-то было. Для оконного меню работает всё более чем... , а для Popup (всплывающего) был замечен баг: когда курсор покидает границы меню, то пиктограмма покинутого пункта остаётся инверсной. Оказалось, что хук WH_MSGFILTER не ловит сообщения о выходе курсора за пределы Popup меню. Пытался поймать какае либо сообщения в хуке WH_GETMESSAGE и в оконной процедуре, сигнализирующие о выходе мыши за педелы пункта Popup меню или за пределы самого меню, но ничего подобного не отследил. Может кто-нить знает, что эта за сообщение и где его ловить ? (о возможности MF_OWNERDRAW - самостоятельно рисовать пункты меню, ловя сообщения WM_MEASUREITEM и WM_DRAWITEM, знаю, но не хотелось бы в это дело зарываться) |
|||
|
||||
bom |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 329 Регистрация: 22.2.2004 Где: Казахстан, Алматы Репутация: 4 Всего: 6 |
У меня не инверсятся, посмотри, может поможет.
http://forum.vingrad.ru/index.php?showtopi...st&p=541117 Присоединённый файл ( Кол-во скачиваний: 12 ) ![]() |
|||
|
||||
ZLon |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.5.2007 Репутация: 3 Всего: 3 |
Посмотрел.
Краткость - сестра таланта. Я на этом этапе был совсем недавно, также использовал функцию SetMenuItemBitmap. Получалось как в системном меню (когда в него встроены каспер или винрар). Но размер пиктограмм 13х13, конвертация 16х16 -> 13х13 и инверсность при выделении пункта меню мення не устраивали. Пришлось капнуть глубже. Обнаружил, что в функции SetMenuItemInfo в структуре MENUITEMINFO помимо параметра MIIM_CHECKMARKS, который отвечает за bmpChecked и bmpUnchecked (они как раз задаются функцией SetMenuItemBitmap), есть параметр MIIM_BITMAP, который задаёт пункту меню растр любого размера. Можешь посмотреть моего монстра, зацени на чём я застрял (контекстное меню на форме). ![]() Присоединённый файл ( Кол-во скачиваний: 14 ) ![]() |
|||
|
||||
bom |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 329 Регистрация: 22.2.2004 Где: Казахстан, Алматы Репутация: 4 Всего: 6 |
Мда, впечатляет
![]() Это есть. Ну не наблюдается у меня инверсность - не в системном меню, не в контекстном, не при выделении, не при покидании границы меню, не в твоем примере, не в моем. Может дело в различии настроек системы? |
|||
|
||||
ZLon |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.5.2007 Репутация: 3 Всего: 3 |
Про инверсность и ёё отсутствие я знаю тока не знаю от чего.
Запускал своё приложение на другой машине из под 2000-ика так тама нет инверсности, а у меня в XP есть. Так значит у тебя, когда курсор покидает Popup меню и его пункт, сам пункт теряет выделение и вместе с этим фон пиктограммы меняется на фон самого меню и пиктограмма не инвертируется ? (тока прежде чем проверять выставь в системе цвет выделенного пункта меню на красный) Это сообщение отредактировал(а) ZLon - 6.5.2007, 18:05 |
|||
|
||||
bom |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 329 Регистрация: 22.2.2004 Где: Казахстан, Алматы Репутация: 4 Всего: 6 |
||||
|
||||
ZLon |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.5.2007 Репутация: 3 Всего: 3 |
Мистика какая-то.
На другой машине (где 2000-ик) приложение на подобие твоего (пиктограммы 13х13) работает без инверсии, а моё инверсирует. Ладна, попробую через MF_OWNERDRAW отрисовать самостоятельно, проверил вроде сообщения WM_MEASUREITEM и WM_DRAWITEM поступают в оконную процедуру, говорят, что так не на много сложнее получится (да и возможностей побольше в виде различных эффектов). |
|||
|
||||
ZLon |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.5.2007 Репутация: 3 Всего: 3 |
Всётаки я дожал своё начинание.
![]() Сначала попробовал словить сообщение WM_MOUSELEAVE, используя функцию TrackMouseEvent, но функция отказалась работать с дескриптором всплывающего меню. ![]() Затем, полностью разочаровавшись в том, что поймаю какое-либо сообщение, решил сэмулировать свой обработчик выхода курсора мыши за пункт меню. Действовал через функции: GetMenuItemRect (определял границы пункта при появлении сообщения WM_MENUSELECT), PtInRect (оценивал вышел ли курсор за пределы RECT при появлениии сообщения WM_MOUSEMOVE), - всё это компактно поместилось в обработчике сообщений WH_MSGFILTER. ![]() И ещё вариант: MenuItemFromPoint (при обработке сообщения WM_MOUSEMOVE), - получилось ещё короче, но остановился на первом варианте т. к. думаю, что он быстрее работает. Смотрел также исходники где используется MF_OWNERDRAW, но ничего миниатюрного и понятного не нашёл (попадальсь только монстры, которые рисовали не то, что мне надо, а переписывать код на свой лад чё-то меня не вставило ![]() |
|||
|
||||
bom |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 329 Регистрация: 22.2.2004 Где: Казахстан, Алматы Репутация: 4 Всего: 6 |
Поздравляю!
![]() А есть уверенность в том что такие навороченные менюшки будут работать как надо на любых машинах юзеров, хотя бы под XP и не завалят саму программу? Но это так, к слову, меня интересует вопрос, почти по теме: Как внедрить свою пиктограмму в контекстное меню проводника (как делают это Winrar, DrWeb и др.)? Излазил реестр, но толком так и не разобрался. Ключи ссылаются на соответствующие ActivX dll, а что делают эти dll - сказать трудно, но дело все в них, скорее всего. |
|||
|
||||
cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 19 Всего: 99 |
Буду рад, если вы напишите маленькую статью для пополнения FAQ'a. Спасибо!
-------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
ZLon |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.5.2007 Репутация: 3 Всего: 3 |
Юзайте на здоровье (присоединённый файл).
О глюках прошу писать. ![]() Что касается системного меню: GetSystemMenu - получаем дескриптор системного меню; через AppendMenu или InsertMenuItem добавляем свой пункт (тока идентификатор должен быть уникальным, но не больше &HF000), наварачиваем пиктограмму (кому как нравится); ставим глобальный хук на месаги от меню типа WH_SYSMSGFILTER, в нём ловим WM_SYSCOMMAND и другие сообщения, нужные для обработки пиктограммы; По WM_SYSCOMMAND запускаем своё приложение, передавая ему объект на котором сработало системное меню (наверняка есть функции API, определяющие выделенность объекта в списке активного окна) (передать можна даже через реестр, вместо записи в адресное пространство нужного приложения или запуска с параметрами); скомпилированную утилитку запихиваем в RUN реестра и дело в шляпе. (что касается DLL в реестре, то эта таже утилитка, но скомпилированная в dll с функцией. Имя функции должно также быть прописано в реестре, наверняка неподалёку от ссылки на dll, - эта тока догадка надо проверять. Точна можно узнать, используя прогу типа Reg Organizer; сравнить реестр до и после изменения настройки Winrara о прописи его в системном меню) Это сообщение отредактировал(а) ZLon - 12.5.2007, 17:54 Присоединённый файл ( Кол-во скачиваний: 12 ) ![]() |
|||
|
||||
bom |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 329 Регистрация: 22.2.2004 Где: Казахстан, Алматы Репутация: 4 Всего: 6 |
Постоянно держать в памяти работающую программу для внедренья своей пиктограммы в контекстное меню - это не подходит. Даже одноразовый запуск - не то. Существуют другие механизмы, вот только какие...
|
|||
|
||||
ZLon |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.5.2007 Репутация: 3 Всего: 3 |
Глянь сюда:
- исходник весь проект французов качнуть не могу, видно регистрация нужна (посмотри mdlMain_bas и MyHandler_cls - они доступны для просмотра); И ещё есть вроде как руководство: http://www.oreilly.com/catalog/vbshell/chapter/ch04.html Переведи да разберись, что это за лабуда (тама вконце про реестр говорится), но dll всёравно придётся писать (как я понял, именно она отвечает за внедрение в системное меню своего пункта и пиктограммы) Это сообщение отредактировал(а) ZLon - 13.5.2007, 19:15 |
|||
|
||||
bom |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 329 Регистрация: 22.2.2004 Где: Казахстан, Алматы Репутация: 4 Всего: 6 |
Там и регистрация не помогла, код доступен только за валюту :(
Спасибо за ссылки, попробую разобраться. |
|||
|
||||
ZLon |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.5.2007 Репутация: 3 Всего: 3 |
Вот исчё реальные ссылочки по написанию COM сервера:
http://www.realcoding.net/teach/Delphi7_pr...a31/Index6.html и http://rsdn.ru/article/winshell/shlext1.xml |
|||
|
||||
![]() ![]() ![]() |
Правила форума "VB6" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | VB6 | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |