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

Posted

技术标签:

【中文标题】Delphi 7 - 为表单中的嵌入式框架处理 MouseWheel 事件?【英文标题】:Delphi 7 - Handling MouseWheel events for Embedded Frames in Forms? 【发布时间】:2011-12-25 23:11:20 【问题描述】:

您好,我有一个表格,里面有几个框架。

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

我尝试了以下方法:

只需为每一帧分配一个 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 答案][1] 他们可能会有所帮助。 [1]:***.com/questions/2472743/… How to direct the mouse wheel input to control under cursor instead of focused?的可能重复 【参考方案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 上方滚动时,这段代码会产生 ***

以上是关于Delphi 7 - 为表单中的嵌入式框架处理 MouseWheel 事件?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 中的 Windows 7 样式通知浮出控件

如何在表单窗口中嵌入 HTML 帮助

Windows 7 的任务栏上的 Delphi 表单图标模糊(启用 MainFormOnTaskbar)

嵌套在 Delphi 框架中的私有组件字段

在 Delphi 中使用框架的公认方法是啥?

如何为 onclick 事件选择 Delphi 框架而不是其组件?