2011-11-10 41 views
6

嗨我有一个窗体里面有几个框架。Delphi 7 - 处理表单中嵌入框架的MouseWheel事件?

对于一些框架,我希望滚动的内容(或至少处理mousewheel事件)。

我曾尝试以下:

只需指定一个OnMouseWheel事件处理程序对每一帧

重写鼠标滚轮事件父窗体:

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中,接收焦点的控件是保存要发送mousewheel事件的帧的面板。

所以,简单地说,我怎样才能将mousewheel事件指向鼠标光标所在的最顶端控件(无论光标在哪个框架/父/表单等中)?

+0

看看[这些SO答案] [ 1]他们可能会帮助。 [1]:http://stackoverflow.com/questions/2472743/what-is-the-best-method-for-implementing-mouse-wheel-activity-in-delphi-vcl-form –

+0

可能的重复[如何指导鼠标滚轮输入来控制光标,而不是集中?](http://stackoverflow.com/questions/2251019/how-to-direct-the-mouse-wheel-input-to-control -under-cursor-instead-of-focused) – Kromster

回答

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; 
+0

出于某种原因,当我在TMainForm上方滚动时,此代码会生成StackOverflow – Kromster