Событие колеса мыши - PullRequest
       11

Событие колеса мыши

2 голосов
/ 09 апреля 2011

У меня есть форма со множеством элементов управления (древовидная структура, заметки, списки, панели и т. Д.).

Я хочу автоматически перемещать полосы прокрутки этих элементов управления, когда мышь находится над компонентами, а колесо прокручивается.

Так же, как работает панель инспектора rad studios, ящик для инструментов, менеджер проектов.

И невозможно ввести один и тот же код на каждом элементе управления (более 11 элементов управления до настоящего времени)

[Изменено]

Спасибо за все ваши ответы, но

элементы управления, такие как кнопки, не имеют полосы прокрутки, чтобы их родители (как панели, рамы) должны быть перемещены, когда Колесо мыши перемещается над кнопками (дочерние элементы управления)

1 Ответ

4 голосов
/ 09 апреля 2011

Добавьте TApplicationEvents к вашей форме и добавьте обработчик OnMessage:

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
var
  pnt: TPoint;
  ctrl: TWinControl;
begin
  if Msg.message = WM_MOUSEWHEEL then
  begin
    if not GetCursorPos(pnt) then Exit;
    ctrl := FindVCLWindow(pnt);
    if Assigned(ctrl) then
    begin
      SendMessage(ctrl.Handle, Msg.message, Msg.wParam, Msg.lParam);
      Handled := true; // or maybe Msg.message := WM_NULL;
    end;
  end;
end;

Обновление

Дэвид Хеффернан [см. Комментарии] предложил умный способ улучшить этот код:

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
var
  pnt: TPoint;
  ctrl: TWinControl;
begin
  if Msg.message = WM_MOUSEWHEEL then
  begin
    if not GetCursorPos(pnt) then Exit;
    ctrl := FindVCLWindow(pnt);
    if Assigned(ctrl) then
      Msg.hwnd := ctrl.Handle;
  end;
end;
...