Delphi 7 - Обработка событий MouseWheel для встроенных фреймов в формах? - PullRequest
6 голосов
/ 10 ноября 2011

Привет, у меня есть форма с несколькими кадрами внутри.

Для некоторых кадров я хочу прокрутить содержимое (или, по крайней мере, обработать событие mousewheel).

Я пробовалследующее:

Простое назначение обработчика события OnMouseWheel для каждого кадра

Переопределение события MouseWheel для родительской формы:

procedure TFmReview.MouseWheelHandler(var Message: TMessage);
var   Control: TControl;
begin
    Control := ControlAtPos(ScreenToClient(SmallPointToPoint(TWMMouseWheel(Message).Pos)), False, True);
    if Assigned(Control) and (Control <> ActiveControl) then
    begin
         ShowMessage(Control.Name);
         Message.Result := Control.Perform(CM_MOUSEWHEEL, Message.WParam, Message.LParam);
         if Message.Result = 0 then
            Control.DefaultHandler(Message);
     end else inherited MouseWheelHandler(Message);
end;

К сожалению, оба варианта не работают.

  • В случае 1 событие никогда не вызывается, однако запускается обработчик колеса мыши родительских форм.
  • В случае 2 элемент управления, который получает фокус, - это панель, содержащаякадр, в который я хочу отправить событие mousewheel.

Итак, проще говоря, как я могу направить событие mousewheel на самый верхний элемент управления, на котором находится курсор мыши (независимо от того, в каком кадре / родителе / ​​форме и т. Д. Находится курсор)?

1 Ответ

1 голос
/ 10 сентября 2012

Чтобы отложить обработку колеса мыши до TWinControl, над которым в данный момент находится курсор мыши, переопределите в основном кадре форму MouseWheelHandler, используя код, подобный следующему:

type
  TMainForm = class(TForm)
  private
    procedure MouseWheelHandler(var AMessage: TMessage); override;
  public
    { Public declarations }
  end;

implementation

procedure TMainForm.MouseWheelHandler(var AMessage: TMessage);
var
  Control: TWinControl;
begin
  Control := FindVCLWindow(SmallPointToPoint(TWMMouseWheel(AMessage).Pos));
  if Assigned(Control) then
  begin
    AMessage.Result := Control.Perform(CM_MOUSEWHEEL, AMessage.WParam,
      AMessage.LParam);
    if AMessage.Result = 0 then
      Control.DefaultHandler(AMessage);
  end
  else
    inherited MouseWheelHandler(AMessage);
end;
...