2011-11-10 29 views
6

こんにちは私は内部にいくつかのフレームを持つフォームを持っています。Delphi 7 - フォーム内の埋め込みフレームの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では、フォーカスを受け取るコントロールは、マウスホイールイベントを送信するフレームを保持するパネルです。

簡単に言えば、どのようにマウスカーソルが上にある最も高いコントロール(マウスカーソルがどのフレーム/親/フォームなどに関係なく)にマウスホイールイベントを向けることができますか?現在、マウスカーソルである上TWinControlにマウスホイールの取り扱いを延期する

+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-of-focused-of-focused) – Kromster

答えて

1

、あなたのメインフレームでのオーバーライドは、このようなコードを使用して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

関連する問題