Главная страница
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.5 MB
Время: 0.013 c
4-1229186518
SCL
2008-12-13 19:41
2010.02.21
Как мне запретить завершение моего процесса из диспетчера задач?


15-1260171051
12
2009-12-07 10:30
2010.02.21
Нашел книгу по администрированию MSSQL


15-1260343163
TRSteep
2009-12-09 10:19
2010.02.21
Обратное проектирование баз


3-1235540952
DelphiN!
2009-02-25 08:49
2010.02.21
Автоматическое закрытие pfIbDataSet перед изменением SQL


2-1261399078
webpauk
2009-12-21 15:37
2010.02.21
Получить значение поля предидущей записи в DBGrid