Прокрутка компонентов, не имеющих фокуса ввода

Прокрутка компонентов, не имеющих фокуса ввода

Колесо мыши используется для прокрутки. Когда прокручиваемый компонент (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 осуществляет поиск элемента управления, который находится под курсором. Если курсор находится не над элементом с фокусом ввода, то сообщение прокрутки будет перенаправлено на элемент под курсором.

Добавить комментарий