Колесо мыши используется для прокрутки. Когда прокручиваемый компонент (TMemo, TListView,TTreeView,…) имеет фокус ввода, движение колесика приведет к вертикальной прокрутке содержимого компонента.
Многие приложения Windows изменяют поведение колеса мыши. При вращении колесика происходит прокрутка того элемента приложения, который находится под мышью, не важно, имеет ли он фокус ввода или нет.
В программах на Delphi так же можно использовать данный прием, повысив функциональность колесика мыши. Таким образом, перемещение колесика будет влиять непосредственно на компонент под курсором, а не на тот, который имеет фокус ввода.
Переместите на форму компонент TApplicationEvents (вкладка Additional).
В обработчике события OnMessage пишем:
procedure TMainForm.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); var mousePos: TPoint; wc: TWinControl; begin if Msg.message = WM_MOUSEWHEEL then begin mousePos.X := Word(Msg.lParam); mousePos.Y := HiWord(Msg.lParam); wc := FindVCLWindow(mousePos); if wc = nil then Handled := True else if wc.Handle <> Msg.hwnd then begin SendMessage(wc.Handle, WM_MOUSEWHEEL, Msg.wParam, Msg.lParam); Handled := True; end; end; end;
Событие OnMessage компонента TApplicationEvents наступает при поступлении любого сообщения программе от Windows.
Если программе передается сообщение WM_MOUSEWHEEL (прокручивается колесико), функцияFindVCLWindow осуществляет поиск элемента управления, который находится под курсором. Если курсор находится не над элементом с фокусом ввода, то сообщение прокрутки будет перенаправлено на элемент под курсором.