Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 7-处理窗体中嵌入帧的鼠标滚轮事件?_Delphi_Focus_Mousewheel_Tform_Tframe - Fatal编程技术网

Delphi 7-处理窗体中嵌入帧的鼠标滚轮事件?

Delphi 7-处理窗体中嵌入帧的鼠标滚轮事件?,delphi,focus,mousewheel,tform,tframe,Delphi,Focus,Mousewheel,Tform,Tframe,嗨,我有一个里面有几个框架的表格 对于某些帧,我希望滚动内容(或者至少处理mousewheel事件) 我尝试了以下方法: 只需为每个帧分配onmouseheel事件处理程序 覆盖父窗体的鼠标滚轮事件: procedure TFmReview.MouseWheelHandler(var Message: TMessage); var Control: TControl; begin Control := ControlAtPos(ScreenToClient(SmallPointToP

嗨,我有一个里面有几个框架的表格

对于某些帧,我希望滚动内容(或者至少处理mousewheel事件)

我尝试了以下方法:

只需为每个帧分配onmouseheel事件处理程序

覆盖父窗体的鼠标滚轮事件:

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;
过程TFmReview.mouseweelHandler(var消息:TMessage);
var控制:TControl;
开始
控件:=ControlAtPos(屏幕到客户端(SmallPointToPoint(TWMMouseWheel(Message.Pos)),False,True);
如果分配了(控制)和(控制活动控制),则
开始
ShowMessage(Control.Name);
Message.Result:=Control.Perform(CM_mouseweel,Message.WParam,Message.LParam);
如果Message.Result=0,则
Control.DefaultHandler(消息);
结束继承的MouseWheelHandler(消息);
结束;
不幸的是,两者似乎都不起作用

  • 在案例1中,事件永远不会触发,但会触发父窗体鼠标滚轮处理程序
  • 在案例2中,接收焦点的控件是保存我希望向其发送鼠标滚轮事件的帧的面板

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

要将鼠标滚轮处理延迟到当前鼠标光标所在的控件上,请使用如下代码在主帧窗体中重写该方法:

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;

看看[这些答案][1]它们可能会有所帮助。[1] :由于某些原因,此代码可能重复。当我滚动到TMA上方时,此代码会产生StackOverflow