Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 MouseWheel перехватить  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1199
Есть форма F1, которая лежит на форме F2.
На форме F2 есть грид, который имеет фокус. На форме F1 лежит скроллбокс, внутри которого несколько TChart-ов. И чарты и скроллбокс имеют свойство TabStop = true.
Но как не кликай по чартам, при вращении колесика мышки скролится грид. Событие OnMouseWheel для скроллбокса не возникает.
А мне нужно скролить скроллбокс, когда мышка над ним. Как это сделать?
22 дек 15, 13:33    [18593914]     Ответить | Цитировать Сообщить модератору
 Re: MouseWheel перехватить  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26386
minva
Событие OnMouseWheel для скроллбокса не возникает.

Может скролллбокс и не подозревает о колесе?
22 дек 15, 13:36    [18593931]     Ответить | Цитировать Сообщить модератору
 Re: MouseWheel перехватить  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1199
wadman, может, а надо, чтоб подозревал:)
22 дек 15, 13:40    [18593974]     Ответить | Цитировать Сообщить модератору
 Re: MouseWheel перехватить  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4552
minva
Есть форма F1, которая лежит на форме F2.
На форме F2 есть грид, который имеет фокус. На форме F1 лежит скроллбокс, внутри которого несколько TChart-ов. И чарты и скроллбокс имеют свойство TabStop = true.
Но как не кликай по чартам, при вращении колесика мышки скролится грид. Событие OnMouseWheel для скроллбокса не возникает.
А мне нужно скролить скроллбокс, когда мышка над ним. Как это сделать?
Гриды - они бывают разные... Если DBGrid -то это известный глюк Борланда...
22 дек 15, 13:52    [18594045]     Ответить | Цитировать Сообщить модератору
 Re: MouseWheel перехватить  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4552
minva,

+ Один из вариантов

procedure TMyForm.OnWheelMouse(var Msg: tagMSG; var Handled: Boolean);
var
   i: SmallInt;
begin
   if Msg.message=WM_MOUSEWHEEL then
    begin
      if(FindControl(Msg.hwnd)<>nil) and (FindControl(Msg.hwnd).ClassName='TDBGrid') and (FindControl(Msg.hwnd).Focused) then
        begin
          if Msg.wParam>0 then
            TDBGrid(FindControl(Msg.hwnd)).DataSource.DataSet.MoveBy(StrToInt(Copy(IntToStr(Msg.wParam*-1),1,2)))
          else
            TDBGrid(FindControl(Msg.hwnd)).DataSource.Dataset.MoveBy(StrToInt(Copy(IntToStr(Msg.wParam*-1),1,1)));
          Msg.message:=0;
        end;
    end;
end;
22 дек 15, 13:57    [18594085]     Ответить | Цитировать Сообщить модератору
 Re: MouseWheel перехватить  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1199
Gerasimenko, спасибо, но, наверное, немного не так. У меня форма F1 абсолютно независима. И надо обеспечить скрол мышкой вне зависимости от того, куда она, форма, ляжет потом.
22 дек 15, 14:11    [18594180]     Ответить | Цитировать Сообщить модератору
 Re: MouseWheel перехватить  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4552
minva
Gerasimenko, спасибо, но, наверное, немного не так. У меня форма F1 абсолютно независима. И надо обеспечить скрол мышкой вне зависимости от того, куда она, форма, ляжет потом.
Ну так переделай, как тебе надо... Делов-то...
22 дек 15, 14:14    [18594217]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: MouseWheel перехватить  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 278
Подниму эту тему, так как ответа тут не дали.
Есть форма, на ней панель. У панели прописаны обработчики OnMouseWheel.
В системе на которой программирую и компилируют фокус нормально переносится на панель и всё прекрасно работает.
При запуске программы на другую систему (где, во имя безопасности, отключено всё, что можно и выглядит она как 98я винда, хотя стоит 10ка). В этой системе фокус всегда остаётся на форме или последних выбранных компонентах, но не на панели, соответственно событие OnMouseWheel панели не срабатывает. Вопрос - почему?
Естественно можно накостылить десяток способов вызова события (самый банальный - при нахождении мыши над формой события панели вызываются из событий панели), но не хочется, так как недавно узнал красивое слово "инкапсуляция" и панель у меня - мой собственный наследный класс со всеми нужными мне параметрами и процедурами, и который могу нарисовать где угодно (рисование графики в OpenGL) и хотелось бы чтоб всё сразу работало.
14 фев 20, 13:43    [22079994]     Ответить | Цитировать Сообщить модератору
 Re: MouseWheel перехватить  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 278
Андрей Игоревич
самый банальный - при нахождении мыши над формой события панели вызываются из событий панели),.

*при нахождении над панелью вызываются события панели из событий формы...
(о блин написал фигню в первый раз).
14 фев 20, 14:49    [22080082]     Ответить | Цитировать Сообщить модератору
 Re: MouseWheel перехватить  [new]
DimaBr
Member

Откуда:
Сообщений: 11496
автор
В системе на которой программирую и компилируют фокус нормально переносится на панель и всё прекрасно работает.

Панель не имеет фокуса. Вы не можете перенести фокус с TEdit на TPanel
14 фев 20, 15:32    [22080118]     Ответить | Цитировать Сообщить модератору
 Re: MouseWheel перехватить  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 278
DimaBr
автор
В системе на которой программирую и компилируют фокус нормально переносится на панель и всё прекрасно работает.

Панель не имеет фокуса. Вы не можете перенести фокус с TEdit на TPanel

У меня работает... - постоянно колесом "скролю", как видно, фокус прекрасно переходит между всем (и трекбары, и эдиты), если "скролить" над панелью -происходит маштабирование.
Но на другой системе это не работает. Если надо делать костыль - как бы его сделать, чтоб он был включен в мой класс, а не в родителя?

+
Картинка с другого сайта.
14 фев 20, 16:34    [22080177]     Ответить | Цитировать Сообщить модератору
 Re: MouseWheel перехватить  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2250
Андрей Игоревич, в Windows 10, в системе есть настройка, отвечающая за передачу событий колеса мыши в контрол под курсором. В зависимости от неё и будет разное поведение.
16 фев 20, 00:34    [22080628]     Ответить | Цитировать Сообщить модератору
 Re: MouseWheel перехватить  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 278
white_nigger
Андрей Игоревич, в Windows 10, в системе есть настройка, отвечающая за передачу событий колеса мыши в контрол под курсором. В зависимости от неё и будет разное поведение.

В общем на MouseMove панели сделал self.SetFocus, вроде всё работает.
17 фев 20, 12:24    [22081193]     Ответить | Цитировать Сообщить модератору
 Re: MouseWheel перехватить  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2250
Андрей Игоревич
В общем на MouseMove панели сделал self.SetFocus, вроде всё работает.
Изменение фокуса на движении мыши - плохое решение. Более правильно сделать так:
1. Проверить текущую настройку системы через SPI_GETMOUSEWHEELROUTING
2. Перекрыть DoMouseWheel, если wheel routing отключен - то определять контрол под мышью и перенаправлять текущее действие ему.

PS: Есть ещё конечно вариант принудительно включить этот режим в системе через SPI_SETMOUSEWHEELROUTING, но за это можно (и нужно) схлопотать люлей от пользователя
17 фев 20, 13:12    [22081275]     Ответить | Цитировать Сообщить модератору
 Re: MouseWheel перехватить  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4086
Application.OnMessage. Можно, даже, через компонент TApplicationEvents обрабатывать.
17 фев 20, 13:29    [22081298]     Ответить | Цитировать Сообщить модератору
 Re: MouseWheel перехватить  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 278
white_nigger
Андрей Игоревич
В общем на MouseMove панели сделал self.SetFocus, вроде всё работает.
Изменение фокуса на движении мыши - плохое решение. Более правильно сделать так:
1. Проверить текущую настройку системы через SPI_GETMOUSEWHEELROUTING
2. Перекрыть DoMouseWheel, если wheel routing отключен - то определять контрол под мышью и перенаправлять текущее действие ему.

PS: Есть ещё конечно вариант принудительно включить этот режим в системе через SPI_SETMOUSEWHEELROUTING, но за это можно (и нужно) схлопотать люлей от пользователя

Перекрывать DoMouseWheel как-то спорно, а если мой класс разместить на панели, которая находиться на панели и та опять на панели (когда делаешь аккуратную разметку такое постоянно) и уже (parent as TWinControl).DoMouseWheel не даст результата. Сверху идти как-то тоже костыльно. Или есть пути попроще?

Kazantsev Alexey
Application.OnMessage. Можно, даже, через компонент TApplicationEvents обрабатывать.

А это не стрельба в муху с пушки? У меня в MouseWhee всё таки чуть математики считается (всякие масштабирования и прочее), не приведет ли к подтормаживаниям? Но можно попробовать.

Сообщение было отредактировано: 17 фев 20, 22:05
17 фев 20, 22:05    [22081721]     Ответить | Цитировать Сообщить модератору
 Re: MouseWheel перехватить  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4086
Андрей Игоревич
А это не стрельба в муху с пушки? У меня в MouseWhee всё таки чуть математики считается (всякие масштабирования и прочее), не приведет ли к подтормаживаниям?

Если оно сейчас не тормозит, с чего должно начать-то?
17 фев 20, 22:14    [22081726]     Ответить | Цитировать Сообщить модератору
 Re: MouseWheel перехватить  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2250
Андрей Игоревич
Перекрывать DoMouseWheel как-то спорно, а если мой класс разместить на панели, которая находиться на панели и та опять на панели (когда делаешь аккуратную разметку такое постоянно) и уже (parent as TWinControl).DoMouseWheel не даст результата.
Это у панели делается. Напиши своего наследника и перекрой метод как я написал. После этого у тебя будет специализированный контрол который ты можешь положить куда угодно и он будет работать как тебе надо.
18 фев 20, 11:04    [22081964]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить