Главная страница
    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-1260687545
Урсулапов_
2009-12-13 09:59
2010.02.21
Как программно отключить и подключить устройство USB?


15-1260851935
Делфиец
2009-12-15 07:38
2010.02.21
Бибилиотека JEDI сомпонентов бесплатна?


3-1234909887
Вопрощающий
2009-02-18 01:31
2010.02.21
C++ и SQLConnection - не прибивается процесс приложения


9-1183470560
THandle
2007-07-03 17:49
2010.02.21
DirectX


15-1260347546
misha_gr
2009-12-09 11:32
2010.02.21
Посоветуйте, плиз, мануал по написанию asm функций.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский