Форум: "Основная";
Текущий архив: 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