EhLib.Com
https://forum.ehlib.com/en/

Демо проекты и решения - Событие колеса мыши.
https://forum.ehlib.com/en/viewtopic.php?f=5&t=1062
Page 1 of 1

Author:  EhLibSupport [ 24 Sep 2020, 01:05 ]
Post subject:  Демо проекты и решения - Событие колеса мыши.

Демо проекты и решения - Передача событий колеса мыши в контрол, над которым находится мышиный курсор.

Как известно в VCL до определенного момента события колеса мыши передавались в контрол, который имел фокус ввода. Из-за этого интерфейс программ написанных на VCL отличался от классических программ под Windows.

Начиная с Delphi XE 10.1 разработчики VCL изменили алгоритм таким образом, что событие колеса посылается в контрол над которым находится мышь.
Теперь колесо мыши работает одинаково как для стандартных Windows контролов так и для контролов написанных в чистом виде на VCL.

У вас также есть возможность реализовать аналогичный алгоритм для Delphi версии раньше чем XE 10.1.
Для этого необходимо внести минимальные изменения в исходники классов TCustomForm и TControl.

- Скопируйте файлы Vcl.Forms.pas и Vcl.Controls.pas в папку с вашим проектом.
- В файл Vcl.Forms.pas измените код метода TCustomForm.MouseWheelHandler следующем образом

Code:
procedure TCustomForm.MouseWheelHandler(var Message: TMessage);
begin
  inherited MouseWheelHandler(Message);
//  with Message do
//  begin
//    if FFocusedControl <> nil then
//      Result := FFocusedControl.Perform(CM_MOUSEWHEEL, WParam, LParam)
//    else
//      inherited MouseWheelHandler(Message);
//  end;
end;

- В файл Vcl.Controls.pas измените код метода TControl.MouseWheelHandler следующем образом

Code:
procedure TControl.MouseWheelHandler(var Message: TMessage);
var
  Form: TCustomForm;
  Capture: TControl;
begin
  Form := GetParentForm(Self);
  Capture := GetCaptureControl;
  if Assigned(Capture) and (Capture <> Form) and (Capture <> Self) and (Capture.Parent = nil) then
    Capture.WndProc(Message);
  if Message.Result = 0 then
  begin
//    if (Form <> nil) and (Form <> Self) then
//      Form.MouseWheelHandler(Message)
//    else
//      Message.Result := Perform(CM_MOUSEWHEEL, Message.WParam, Message.LParam);
    if (Form <> nil) and (Form <> Self) then
      Form.MouseWheelHandler(Message);
    if Message.Result = 0 then
      Message.Result := Perform(CM_MOUSEWHEEL, Message.WParam, Message.LParam);
  end;
end;

-- Перекомпилируйте весь проект, запустите и проверьте результат.

Page 1 of 1 All times are UTC
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/