Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.21;
Скачать: CL | DM;

Вниз

Обработка Mouse Wheel: как это сделать корректно? Вот в Бате это   Найти похожие ветки 

 
EgorovAlex ©   (2009-03-26 13:17) [0]

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


 
Dimka Maslov ©   (2009-03-26 13:25) [1]

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


 
EgorovAlex ©   (2009-03-26 13:35) [2]

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


 
Dimka Maslov ©   (2009-03-26 13:40) [3]

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


 
EgorovAlex ©   (2009-03-26 13:54) [4]

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


 
Dimka Maslov ©   (2009-03-26 13:56) [5]

Перебором

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 14:19) [6]

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

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;

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


 
EgorovAlex ©   (2009-03-26 16:56) [7]

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

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

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


 
Dimka Maslov ©   (2009-03-26 19:03) [8]

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


 
EgorovAlex ©   (2009-03-27 08:50) [9]

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


 
KSergey ©   (2009-03-27 09:59) [10]

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


 
EgorovAlex ©   (2009-03-27 10:08) [11]

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


 
KSergey ©   (2009-03-27 11:47) [12]

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



Страницы: 1 вся ветка

Текущий архив: 2010.02.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
15-1260542319
TUser
2009-12-11 17:38
2010.02.21
Видеокарту никому не надо?


1-1238398266
Дмитрий С
2009-03-30 11:31
2010.02.21
Отключить автоматические AddRef и Release в Delphi?


15-1260480620
Юрий
2009-12-11 00:30
2010.02.21
С днем рождения ! 11 декабря 2009 пятница


15-1260350259
Сергей М.
2009-12-09 12:17
2010.02.21
Delphi for PHP


2-1261473957
pg81
2009-12-22 12:25
2010.02.21
Как передать какртинку и получить картику(не ресурс) из dll?