Delphi 7 - 如何处理嵌入式框架在表单中的鼠标滚轮事件?

6

你好,我有一个包含多个框架的表单。

对于其中一些框架,我希望能够滚动内容(或至少处理鼠标滚轮事件)。

我尝试了以下方法:

为每个框架分别指定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下,接收焦点的控件是包含我想要发送鼠标滚轮事件的框架的面板。
因此,简而言之,如何将鼠标滚轮事件定向到鼠标光标所在的最顶层控件(无论光标位于哪个框架/父级/窗体等)?

看一下这些SO答案,它们可能会有所帮助。 - Brian Frost
1个回答

1
将鼠标滚轮处理推迟到当前鼠标光标所在的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;

由于某些原因,当我滚动到TMainForm上方时,此代码会产生StackOverflow。 - Kromster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接