Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > как в TPanel ловить прокрутку колеса мыши


Автор: arankar 29.12.2010, 06:58
вот такой код не ловить. что у меня неправильно или это сообщение перекрыто у родителя? Как это можно реализовать???

Код

type
  TWheelPanel = class(TPanel)
  private
    procedure WMWHEEL(var Msg: TMessage); message WM_MOUSEWHEEL;
  end;
...........................

procedure TWheelPanel .WMWHEEL(var Msg: TMessage);
begin
 ..........................
end;


M
Rrader
Используйте подсветку кода

Автор: Snowy 29.12.2010, 12:04
Будет получать, если будет фокус на данном компоненте.
Т.к. Panel обычно фокус не получает, поставь ей TabStop = true, чтобы получала.
Или кинь на неё компонент, который поймает фокус (например кнопку)

Автор: CROTishka 29.12.2010, 12:11
TPanel не может получать фокус. WM_MOUSEWHEEL получает активный(под фокусом ввода) контрол

Автор: Snowy 29.12.2010, 12:14
Если этот контрол будет лежать на панели, то получать он будет после того, как панель ему сообщение отдаст.
То есть сначала это сообщение получит панель, а потом уже дочерний компонент.
Если же панель имеет TabStop = true, то сама может получить фокус и являться конечным получателем.

Автор: CROTishka 29.12.2010, 13:12
Snowy, ответьте лучше на мой вопрос в этом разделе smile

Автор: kami 29.12.2010, 13:12
Может быть глупый вопрос, но тем не более: на форме/фрейме лежит TPanel или TWheelPanel?

Автор: arankar 29.12.2010, 14:55
Snowy, спасибо за идею получилось, только TabStop  true не делаю а при вхождении курсора если фокуса нету вызываю SetFocus. Теперь когда курсор покидает панель как можно убрать фокус, или другому оконному элементу надо фокус отдать?

kami, экземпляр класса TWheelPanel на форме

Автор: CROTishka 29.12.2010, 15:20
лучше сделайте так чтобы форма ловила WM_MOUSEWHEEL и слала его контролу под мышкой. (возможно ещё сообщения почистить придётся, чтобы фокусу не приходило).
Хотя вообще странный у вас функционал какой-то smile

Автор: Snowy 29.12.2010, 15:24
Перед тем, как забрать у кого-нибудь фокус, запомни ActiveControl, а потом верни фокус ему.
А про табстоп я упоминул, как альтернативу. Например, если на панели нет никаких контролов, способных получить фокус...

Добавлено через 2 минуты и 34 секунды
CROTishka, ты не поверишь, но у него свой компонент - наследник панели.
И он не умеет приказывать форме ловить сообщения.

Автор: arankar 30.12.2010, 06:17
Snowy, внутри моего класса, ActiveControl как можно узнать или как свойство форму передать надо???

если setFocus делаю работает даже если на панели нету никаких контролов это нормально?

CROTishka почему странный? в чем странность? 

просто хочу чтобы все осталось внутри класса

Автор: Snowy 30.12.2010, 13:57
Если тебя бросили на форму, то форма - твой владелец. А у формы можно спросит, кто сейчас активный.
Код
if Owner is TForm then
  туалетный_утёнок_активный := TForm(Owner).ActiveControl;

Автор: CROTishka 30.12.2010, 14:02
Цитата(Snowy @ 29.12.2010,  15:24)
Добавлено @ 15:27
CROTishka, ты не поверишь, но у него свой компонент - наследник панели.
И он не умеет приказывать форме ловить сообщения.

я просто предположил, что у него задача не сделать контрол, а реализовать некую фичу, которую можно реализовать по-другому.
http://www.gunsmoker.ru/2008/10/x-y-z.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)