gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:02:31 24 4
gpt4 key购买 nike

嗨,我有一个表单,里面有几个框架。

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

我尝试过以下方法:

只需为每个帧分配一个 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 中,接收焦点的控件是保存我希望向其发送鼠标滚轮事件的框架的面板。

那么,简单地说,我如何将鼠标滚轮事件定向到鼠标光标所在的最顶层控件(无论光标位于哪个框架/父/窗体等中)?

最佳答案

将鼠标滚轮处理推迟到 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;

关于Delphi 7 - 处理表单中嵌入框架的 MouseWheel 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8076524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com