Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пиктограммы в меню 
V
    Опции темы
ZLon
  Дата 5.5.2007, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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, знаю, но не хотелось бы в это дело зарываться)
PM MAIL   Вверх
bom
Дата 6.5.2007, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: 4
Всего: 6



У меня не инверсятся, посмотри, может поможет.
http://forum.vingrad.ru/index.php?showtopi...st&p=541117


Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  graphmenu.zip 2,77 Kb
PM MAIL   Вверх
ZLon
  Дата 6.5.2007, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.5.2007

Репутация: 3
Всего: 3



Посмотрел.
Краткость - сестра таланта.
Я на этом этапе был совсем недавно, также использовал функцию SetMenuItemBitmap.
Получалось как в системном меню (когда в него встроены каспер или винрар).
Но размер пиктограмм 13х13, конвертация 16х16 -> 13х13 и инверсность при выделении пункта меню мення не устраивали.
Пришлось капнуть глубже.
Обнаружил, что в функции SetMenuItemInfo в структуре MENUITEMINFO помимо параметра MIIM_CHECKMARKS, который отвечает за bmpChecked и bmpUnchecked (они как раз задаются функцией SetMenuItemBitmap), есть параметр MIIM_BITMAP, который задаёт пункту меню растр любого размера.

Можешь посмотреть моего монстра, зацени на чём я застрял (контекстное меню на форме). smile 

Присоединённый файл ( Кол-во скачиваний: 14 )
Присоединённый файл  BitmapInMenu.zip 6,62 Kb
PM MAIL   Вверх
bom
Дата 6.5.2007, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: 4
Всего: 6



Мда, впечатляет  smile 

Цитата(ZLon @  6.5.2007,  12:38 Найти цитируемый пост)
 размер пиктограмм 13х13, конвертация 16х16 -> 13х13...

Это есть.

Цитата(ZLon @  6.5.2007,  12:38 Найти цитируемый пост)
... и инверсность при выделении пункта меню мення не устраивали

Ну не наблюдается у меня инверсность - не в системном меню, не в контекстном, не при выделении, не при покидании границы меню, не в твоем примере, не в моем. Может дело в различии настроек системы?

PM MAIL   Вверх
ZLon
  Дата 6.5.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.5.2007

Репутация: 3
Всего: 3



Про инверсность и ёё отсутствие я знаю тока не знаю от чего.
Запускал своё приложение на другой машине из под 2000-ика так тама нет инверсности, а у меня в XP есть.

Так значит у тебя, когда курсор покидает Popup меню и его пункт, сам пункт теряет выделение и вместе с этим фон пиктограммы меняется на фон самого меню и пиктограмма не инвертируется ?

(тока прежде чем проверять выставь в системе цвет выделенного пункта меню на красный)

Это сообщение отредактировал(а) ZLon - 6.5.2007, 18:05
PM MAIL   Вверх
bom
Дата 6.5.2007, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: 4
Всего: 6



Цитата(ZLon @  6.5.2007,  20:59 Найти цитируемый пост)
у тебя, когда курсор покидает Popup меню и его пункт, сам пункт теряет выделение и вместе с этим фон пиктограммы меняется на фон самого меню и пиктограмма не инвертируется ?

Верно, с красным тоже. 

PM MAIL   Вверх
ZLon
Дата 7.5.2007, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.5.2007

Репутация: 3
Всего: 3



Мистика какая-то.
На другой машине (где 2000-ик) приложение на подобие твоего (пиктограммы 13х13) работает без инверсии, а моё инверсирует.
Ладна, попробую через MF_OWNERDRAW отрисовать самостоятельно, проверил вроде сообщения WM_MEASUREITEM и WM_DRAWITEM поступают в оконную процедуру, говорят, что так не на много сложнее получится (да и возможностей побольше в виде различных эффектов).
PM MAIL   Вверх
ZLon
Дата 10.5.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.5.2007

Репутация: 3
Всего: 3



Всётаки я дожал своё начинание. smile 
Сначала попробовал словить сообщение WM_MOUSELEAVE, используя функцию TrackMouseEvent, но функция отказалась работать с дескриптором всплывающего меню.  smile 
Затем, полностью разочаровавшись в том, что поймаю какое-либо сообщение, решил сэмулировать свой обработчик выхода курсора мыши за пункт меню.
Действовал через функции: GetMenuItemRect (определял границы пункта при появлении сообщения WM_MENUSELECT), PtInRect (оценивал вышел ли курсор за пределы RECT при появлениии сообщения WM_MOUSEMOVE), - всё это компактно поместилось в обработчике сообщений WH_MSGFILTER. smile 
И ещё вариант: MenuItemFromPoint (при обработке сообщения WM_MOUSEMOVE), - получилось ещё короче, но остановился на первом варианте т. к. думаю, что он быстрее работает.

Смотрел также исходники где используется MF_OWNERDRAW, но ничего миниатюрного и понятного не нашёл (попадальсь только монстры, которые рисовали не то, что мне надо, а переписывать код на свой лад чё-то меня не вставило   smile )
PM MAIL   Вверх
bom
Дата 10.5.2007, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: 4
Всего: 6



Поздравляю!  smile Познавательно.
А есть уверенность в том что такие навороченные менюшки будут работать как надо на любых машинах юзеров, хотя бы под XP и не завалят саму программу?
Но это так, к слову, меня интересует вопрос, почти по теме:
Как внедрить свою пиктограмму в контекстное меню проводника (как делают это Winrar, DrWeb и др.)?
Излазил реестр, но толком так и не разобрался. Ключи ссылаются на соответствующие ActivX dll, а что делают эти dll - сказать трудно, но дело все в них, скорее всего.

PM MAIL   Вверх
cardinal
Дата 10.5.2007, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Буду рад, если вы напишите маленькую статью для пополнения FAQ'a. Спасибо!


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
ZLon
Дата 11.5.2007, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.5.2007

Репутация: 3
Всего: 3



Юзайте на здоровье (присоединённый файл).
О глюках прошу писать. smile 

Что касается системного меню:
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 )
Присоединённый файл  BitmapInMenu2.zip 5,88 Kb
PM MAIL   Вверх
bom
Дата 12.5.2007, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: 4
Всего: 6



Постоянно держать в памяти работающую программу для внедренья своей пиктограммы в контекстное меню - это не подходит. Даже одноразовый запуск - не то. Существуют другие механизмы, вот только какие...

PM MAIL   Вверх
ZLon
Дата 13.5.2007, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
bom
Дата 14.5.2007, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: 4
Всего: 6



Там и регистрация не помогла, код доступен только за валюту :(
Спасибо за ссылки, попробую разобраться.
PM MAIL   Вверх
ZLon
Дата 17.5.2007, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.5.2007

Репутация: 3
Всего: 3



Вот исчё реальные ссылочки по написанию COM сервера:

http://www.realcoding.net/teach/Delphi7_pr...a31/Index6.html

и

http://rsdn.ru/article/winshell/shlext1.xml
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.1048 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.