Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обработка Mouse Wheel: как это сделать корректно? Вот в Бате это


EgorovAlex ©   (2009-03-26 13:17:00) 

работает как надо - прокручивается тот элемент, над которым находится курсор мыши, а у меня прогручивается тот, элемент, который имеет фокус ввода. Как это исправить? Но чтобы фокус ввода не переходил на прокручиваемый элемент


KSergey   (2009-03-27 11:47:00) [1]

Видмо так же как в коде выше - перебором контролов на активной форме, либо (ваще круто) - на всех видимых формах приложения.


EgorovAlex   (2009-03-27 10:08:00) [2]

А если я это в Application.OnMessage сделаю, то как узнать, куда нужно мне это передавать? Всё-равно получается привязки к форме не избежать


KSergey   (2009-03-27 09:59:00) [3]

может проще соотв. сообщение вылавливать и именно сообщение пересылать куда надо? хотя бы интерфейс посыла сообщений един.
можно даже на обработчик Application.OnMessage тогда зацепиться, чтобы в каждой форме не делать.


EgorovAlex   (2009-03-27 08:50:00) [4]

Что-то я не совсем понимаю, мне нужно для каждого контрола написать обработчик OnMouseWheel? Но в нём же я получаю нотификацию о том, что сейчас будет прокрутка, а контрол сам производит прокрутку. Или мне в этом обработчике нужно реализовать собственную прокрутку?


Dimka Maslov   (2009-03-26 19:03:00) [5]

У каждого контрола есть событие, которое обрабатывает события от колёсика мыши, надо всем контролам прописать обработчик этого события и вызывать его (обработчик) напрямую.


EgorovAlex   (2009-03-26 16:56:00) [6]

Пытаюсь делать так:

if Handled then
 C.Perform(WM_MOUSEWHEEL, 0, {Здесь что передавать});

И как в этом случае избежать зацикливания, т.к. это сообщение сначала к главной форме придёт


EgorovAlex   (2009-03-26 14:19:00) [7]

Спасибо за код, сейчас дошёл до этого:

procedure TFormQueue.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var
 C: TControl;
begin
 C := GetControlAtPos(MousePos);
 Handled := Assigned(C);
 if Handled then
   {}
end;

Что мне написать в {}? Как вызвать метод прокрутки?


Dimka Maslov   (2009-03-26 13:56:00) [8]

Перебором

function TForm1.GetControlAtPos(const Pos: TPoint): TControl;
var
C: TControl;
R: TWinControl;
begin
R := Self;
Result := nil;
repeat
 C := R.ControlAtPos(R.ScreenToClient(Pos), True, True);
 if not Assigned(C) then begin
  Result := R;
  Break;
 end;
 if not (C is TWinControl) then begin
  Result := C;
  Break;
 end;
 R := TWinControl(C);
until False;
end;


EgorovAlex   (2009-03-26 13:54:00) [9]

Что-то не могу найти, как определить какой компонент находится в заданных координатах формы?


Dimka Maslov   (2009-03-26 13:40:00) [10]

В форме обрабатывается событие OnMouseWheel (KeyPreview надо ставить в True). Оно же и вызывается для компонентов.


EgorovAlex   (2009-03-26 13:35:00) [11]

Т.е. в форме я обрабатываю WM_MOUSEWHEEL, смотрю над каким элементом мышь и шлю это событие этому элементу? Как слать?


Dimka Maslov   (2009-03-26 13:25:00) [12]

В отличие от кнопок и перемещение мыши события от колёсика получает активный элемент упарвления (он же получает и события от клавиатуры). По-этому события от колёса мыши надо перехватывать формой, определять, над каким компонентом находится курсор и перенаправлять туда события.


Наверх

Титульная страница Поиск, карта сайта Написать письмо