![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Seroga |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 12.10.2008 Репутация: нет Всего: нет |
Здравствуйте!
Собрался я сделать прокрутку мышью закладок у PageControl'а когда они выходят за границы выдимости, как это сделано в например в браузерах. То есть неважно где сейчас фокус, если наводишь мышь на область закладок и крутишь колесо мышки закладки прокручиваются. Другой пример Outlook из офиса, неважно где фокус, куда наводишь мышь в той области и делается прокрутка. Сделал для пробы отлова сообщения так:
Все работает в случае если фокус у компонента который лежит на PageControl'е. То есть тут работает цепочка по которой передается сообщение "выше" на парента и аж до формы. Но когда фокус у контрола который лежит рядом, например на панели, WM_MOUSEWHEEL на PageControl не приходит. Вариант заюзать TApplication.OnMessage нежелателен. Можно ли как-то еще отловить сообщение WM_MOUSEWHEEL если контрол на который оно пришло не имеет в цепочке Parent'ов PageControl? |
|||
|
||||
| drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 5 Всего: 8 |
Вам нужно перехватывать WM_MOUSEWHEEL на уровне формы.
если есть несколько областей реагирующих на колесико, то их можно поместить в разные контейнеры и производить перехват на уровне контейнеров (TPanel) -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
| Seroga |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 12.10.2008 Репутация: нет Всего: нет |
Не, на уровне формы не подоходит, я же компонент делаю, на каждой форме такое лепить не фонтан. Насоветовали глянуть в сторону хуков мышки. Начал лазить по исходникам делфи, нашел у компонента Ribbon как раз то что ищу, у него закладки скролятся и сделано через хук. Предварительный вариант такой:
|
|||
|
||||
| drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 5 Всего: 8 |
чтоб хорошего насоветовали... а вот всякой пакости как всегда вагон.... Вы отдаете себе отчет в том, что будет если на форме (или приложении) окажутся два и более таких компонента? Как оно будет работать? Если Вы делаете "отдельный" компонент, то имеет смысл сделать свойство MouseWheelOwner: TForm и задать в него форму на которой лежит панель. при создании панели в соответствующие Event свойства MouseWheelOwner прописать свои обработчики. Это если Вам уж так хочется заниматься тем, что порицают все сишники. А так нормальное решение Вам предложено... хотите страдать - страдайте... -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
-------------------- Обижено школьников: 8 |
|||
|
||||
| Seroga |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 12.10.2008 Репутация: нет Всего: нет |
Ну и в чем тут удобство? А если мне на форме нужны будут эти обработчики, то как быть? Как быть с сотней других форм где есть уже PageControl? Их всех перелопатить? Добавлено через 26 секунд
Ну оно вроде так и сделано. Нужно только код из Destroy перенести в finalization. |
||||
|
|||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
это можно, а вот из Create просто перенести в initialization нельзя, потому что тогда при использовании компонента в длл это будет обращение к user32 api из DllMain, а это черевато
-------------------- Обижено школьников: 8 |
|||
|
||||
| drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 5 Всего: 8 |
только это не соответствует идеологии VCL... а делать то можно... у Вас все PageControl получат уведомление о прокрутке и все прокрутятся. Принятие решения о том кому "адресовано" действие равносильно прописыванию общей реакции для формы. О чем и говорилось выше.... Другими словами хук будет простым решение только для условия одного "живого" PageControl. В остальных случаях решение теряет тривиальность и потребует широкого напильника для каждого конкретного случая. При этом получение события формой (контейнером) и принятие решения кого крутить остается одинаково тривиальным при любом масштабе задачи. извольте... какой DllMain? Хук то локальный должен быть! -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
хук-то локальный, но он не при чем. компонент должен же работать в том числе и из длл, как все нормальные компоненты -------------------- Обижено школьников: 8 |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |