![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| ZBugz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
Еще раз привет. А как перекрыть hint системных кнопок формы ? Ну те что закрыть\свернуть\минимизировать ?
|
|||
|
||||
| ZBugz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
Нашел такой для кнопок, когда тыкаешь правой кнопкой на программу, меню, работает
Осталось на hint на кнопках ссвернуть\развернуть\минимизировать перехватить |
|||
|
||||
| Amphiluke |
|
||||||
|
☽ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1253 Регистрация: 26.8.2009 Репутация: 5 Всего: 112 |
Как методически правильно отловить непосредственно сам момент всплывания системного tooltip'а и изменить поведение по умолчанию, хз.
Однако создать видимость «подмены» всплывающих подсказок (или скрыть их вообще нафиг) очень просто. Для этого сначала выясняем класс окна системного tooltip'а. Нашли, допустим, что это '#32774'. Создаем в своем проекте, если необходимо, отдельную форму, которая будет подменять системный tooltip. Задаем ей атрибуты FormStyle=fsStayOnTop и BorderStyle=bsNone. Кидаем на форму компонент TLabel. Далее пишем перехватчик мышиных событий в неклиентской области главного окна.
Последняя строка в этом обработчике удаляет системную подсказку, которая норовит вылезти при наведении на кнопки в заголовке окна. Вот функция-удалялка.
Если в методе WMNCMouseMove убрать все начисто, за исключением строки
то просто получится эффект, при котором системная подсказка не будет появляться. Вот так. В архиве пример с исходниками и программой. Присоединённый файл ( Кол-во скачиваний: 6 )
Titlebar_Hints.rar 189,11 Kb |
||||||
|
|||||||
| ZBugz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
Прикольно, работает.
Теперь тогда вопрос, а как созать свой хинт ? |
|||
|
||||
| Amphiluke |
|
|||
|
☽ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1253 Регистрация: 26.8.2009 Репутация: 5 Всего: 112 |
Ну так добро пожаловать в MSDN.
Добавлено через 1 минуту и 28 секунд Ага. Ссылку не совсем точно дал. http://msdn.microsoft.com/en-us/library/bb...6(v=VS.85).aspx |
|||
|
||||
| ZBugz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
Я там ниче не понимаю Я это вылавливаю потому, что при использовании забугорских и наших скинируемых компонентов, косяки с надписями возникают, т.е. показывают в основном английские, а хотца что бы моих мультиязычных приложениях все было переведенно. |
|||
|
||||
| Amphiluke |
|
|||
|
☽ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1253 Регистрация: 26.8.2009 Репутация: 5 Всего: 112 |
Там вся работа только перевести готовый код с C на Delphi, а сам-то код уже готовый ждет вас там. Вот: попробовал адаптировать для вашей задачи пример из MSDN создания собственного tooltip'а и управления им. Все отличие в том, что в их примере tooltip создается для обычной кнопки, а здесь — для кнопок в заголовке окна... Как вы и желали, никаких дополнительных форм создавать не нужно. Вот полный модуль приложения:
|
|||
|
||||
| ZBugz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
Все, спасибо
Пример прилагаю. Достойно DPKB Есдинственно замечание: На Delphi 6 все работает. На Delphi 2010 что бы заработали hints у кнопок, надо включить в свойствах проекта "Enable runtime themes" Проверяйте, если что, отпишите тут, что я не так там написал... Это сообщение отредактировал(а) ZBugz - 20.5.2010, 14:43 Присоединённый файл ( Кол-во скачиваний: 7 )
SystemHint.rar 4,37 Kb |
|||
|
||||
| Amphiluke |
|
|||
|
☽ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1253 Регистрация: 26.8.2009 Репутация: 5 Всего: 112 |
Есть еще направления оптимизации этой программы.
Дело в том, что системный tooltip «обслуживает» все окна, имеющие заголовок с кнопками, т.е. он присутствует в системе в единственном экземпляре. Иными словами, то окно класса '#32774' достаточно отыскать при помощи EnumWindows лишь один раз, сохранить его дескриптор в переменной, и больше в перехватчике сообщения WM_NCMOUSEMOVE не затрачивать время на перебор окон и поиск среди них окна класса '#32774'. Это вам домашнее задание, если хотите. Добавлено через 14 минут и 3 секунды P.S. Немного не так выразился, как хотел. Самое главное, что системный tooltip не пересоздается всякий раз, когда должна всплывать подсказка и не уничтожается, когда она должна исчезнуть. Именно поэтому можно один раз найти и сохранить Handle окна tooltip'а и потом использовать его. А то, что системный tooltip обслуживает и остальные окна, — это да, но имеет второстепенное значение в данном случае. |
|||
|
||||
| ZBugz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
Спасибо конечно, я такой профан в этом, что домашнее задание не получиться
Я на уровне "Hello word" пока |
|||
|
||||
| Amphiluke |
|
|||
|
☽ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1253 Регистрация: 26.8.2009 Репутация: 5 Всего: 112 |
Ладно. Грех, конечно
Вот как в конечном виде может выглядеть код для этой задачки.
|
|||
|
||||
| ZBugz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
Ну тогда для полного счастья надо как то задержку показа сделать, как в стандартном окне
Добавлено через 7 минут и 18 секунд И кстати, SysTooltip всегда = 0, а должен же быть '#32774' ? |
|||
|
||||
| Amphiluke |
|
||||
|
☽ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1253 Регистрация: 26.8.2009 Репутация: 5 Всего: 112 |
Похоже, я вас самого начала немного неправильно понял. Если вам не нужно создавать tooltip своего собственного дизайна, и если не нужно вызывать его когда душе заблагорассудится, а достаточно просто заменить текст стандартной всплывающей подсказки, полностью сохранив при этом поведение по умолчанию, то тогда нафиг не нужно конструировать собственное окно класса TOOLTIPS_CLASS... Просто достаточно в момент всплытия рисовать на окне стандартного tooltip'а свой текст обычными функциями GDI. Вот.
|
||||
|
|||||
| ZBugz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 636 Регистрация: 15.2.2006 Где: Москва Репутация: 6 Всего: 6 |
Это как обычно А код не пашет Стандартный вылазиет и прям видно что хочет нарисоваться свое, но не может, в итоге видно только полоску от хинта... А стандартный так и показываеться... |
|||
|
||||
| Amphiluke |
|
|||
|
☽ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1253 Регистрация: 26.8.2009 Репутация: 5 Всего: 112 |
Странно. У меня (в D2007) вообще никаких проблем не наблюдается. Вы использовали в точности тот же код?
И как понять при том что Так что все-таки вылазит: какая-то полоска вместо хинта или же обычный нормальный полноценный хинт со стандартной надписью? Присоединённый файл ( Кол-во скачиваний: 16 )
DrawOnTooltip.png 2,73 Kb |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |