powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / прокрутка TScrollBox колесом мыши
9 сообщений из 9, страница 1 из 1
прокрутка TScrollBox колесом мыши
    #39751520
Ghost Writer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слева список форм (TVirtualDrawTree), справа TNotebook. На каждую страницу TNotebook помещаю формы (без рамки, как фреймы)
В некоторых формах используется TScrollBox и, чтобы его можно было прокручивать колесом мыши, такой код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
procedure ScrollBoxMouseWheelHandler(var Msg: TMessage); message WM_MOUSEWHEEL

procedure TForm2.ScrollBoxMouseWheelHandler(var Msg: TMessage);
var
  WheelDelta: Integer;
begin
  inherited;

  if not PtInRect(ScrollBox.ClientRect, ScrollBox.ScreenToClient(Mouse.CursorPos)) then
    Exit;

  with ScrollBox do
  begin
    if Msg.WParam < 0 then
      WheelDelta := -1 * VertScrollBar.Increment
    else WheelDelta := VertScrollBar.Increment;

    if ((VertScrollBar.Position = 0) and (WheelDelta > 0)) or
       ((VertScrollBar.Position = VertScrollBar.Range - ClientHeight) and (WheelDelta < 0)) then
       Exit;

    VertScrollBar.Position := VertScrollBar.Position - WheelDelta;
  end;
end;


Проблема в том, что обработчик ScrollBoxMouseWheelHandler не выполняется, пока форма не получит фокус.

Можно ли в данном случае сделать так, чтобы крутилось то, что находится под указателем мыши независимо от фокуса ?
...
Рейтинг: 0 / 0
прокрутка TScrollBox колесом мыши
    #39751537
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ghost WriterМожно ли в данном случае сделать так, чтобы крутилось то, что находится под указателем мыши независимо от фокуса ?По идее, обработчик WM_MOUSEWHEEL должна иметь основная форма, которая будет определять над каким скроллбоксом находится мышь и перенаправлять обработчик туда
...
Рейтинг: 0 / 0
прокрутка TScrollBox колесом мыши
    #39751547
Ghost Writer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почти работает, но
когда фокус на списке (TVirtualDrawTree), то ScrollBoxMouseWheelHandler не выполняется
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TFormDocsKit.ScrollBoxMouseWheelHandler(var Msg: TMessage);
var
  ScrollControl: TWinControl;
begin
  inherited;

  ScrollControl := FindVCLWindow(Mouse.CursorPos);
  if Assigned(ScrollControl) then
  begin
    Caption := TWinControl(ScrollControl).Name;

  end;
end;
...
Рейтинг: 0 / 0
прокрутка TScrollBox колесом мыши
    #39751549
Ghost Writer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_По идее, обработчик WM_MOUSEWHEEL должна иметь основная форма, которая будет определять над каким скроллбоксом находится мышь и перенаправлять обработчик тудав предыдущем сообщении забыл пояснить, что ScrollBoxMouseWheelHandler в главной форме как посоветовали
...
Рейтинг: 0 / 0
прокрутка TScrollBox колесом мыши
    #39751603
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ghost Writerкогда фокус на списке (TVirtualDrawTree), то ScrollBoxMouseWheelHandler не выполняется значит компонент сам обрабатывает это сообщение. Поэтому оно не доходит до родителя. Я бы поискал по исходникам этот обработчик и посмотрел, что можно сделать.
...
Рейтинг: 0 / 0
прокрутка TScrollBox колесом мыши
    #39751779
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если говорить о TScrollBox то это определённо onMouseWheel с wheelDelta = 120 это dec(VertScrollBar.position, X) а для else то inc
...
Рейтинг: 0 / 0
прокрутка TScrollBox колесом мыши
    #39752057
Beltar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я просто на onMouseEnter скроллбокса вешал SetFocus, в моих случаях это вполне допустимо. Логика понятна, приложение не знает, что именно вы хотите прокручивать, но если у вас все просто, и вы как раз не хотите, чтобы скроллбокс ждал клика мыши и т. п., то передаст фокус, то вам это тоже должно подойти.

На крайняк, что мешает запоминать, кто был с фокусом до входа мыши, и потом восстанавливать в onMouseLeave?

И зачем вам обработчик сообщения? Не знаю, что за версия, но onMouseWheelUp\Down у скроллбокса есть встроенные.
...
Рейтинг: 0 / 0
прокрутка TScrollBox колесом мыши
    #39752105
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Недосуг проверять, но Form.KeyPreview=True не все ли сообщения перехватывает? В таком случае можно сделать один обработчик и внутри него уже переправлять событие контролу под курсором
...
Рейтинг: 0 / 0
прокрутка TScrollBox колесом мыши
    #39752326
Ghost Writer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Beltar,

делфи 7. увы onMouseEnter / onMouseLeave нет.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / прокрутка TScrollBox колесом мыши
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]