Delphi 7 - 处理表单中嵌入式帧的MouseWheel事件?

Sim*_*mon 6 delphi focus mousewheel tframe tform

嗨,我有一个内部有几个框架的表格.

对于某些帧,我希望滚动内容(或至少处理鼠标轮事件).

我尝试过以下方法:

只需为每个帧分配一个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;
Run Code Online (Sandbox Code Playgroud)

不幸的是,两者似乎都没有用.

  • 在情况1中,事件永远不会被触发,但是父表单鼠标轮处理程序被触发.
  • 在情况2中,接收焦点的控件是保持我希望发送鼠标轮事件的帧的面板.

因此,简单地说,如何将鼠标滚轮事件指向鼠标光标所在的最顶层控件(无论光标位于哪个帧/父/窗体等)?

TLa*_*ama 2

要将鼠标滚轮处理推迟到当前鼠标光标所在的位置,请使用如下代码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;
Run Code Online (Sandbox Code Playgroud)