Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2010.02.21;
Скачать: [xml.tar.bz2];

Вниз

Обработка 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.006 c
15-1260826221
Юрий
2009-12-15 00:30
2010.02.21
С днем рождения ! 15 декабря 2009 вторник


2-1261139465
ford
2009-12-18 15:31
2010.02.21
TIdHTTP и Transfer-Encoding: chunked


3-1234936713
тимохов
2009-02-18 08:58
2010.02.21
Как обновлять TAdoTable в одной форме, при изменении в другой?


15-1260396353
Petr V. Abramov
2009-12-10 01:05
2010.02.21
есть ли паровоз?


15-1260478295
antonn
2009-12-10 23:51
2010.02.21
Определение ресурсоемких расчетов в методах





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский