6

こんにちは、いくつかのフレームを含むフォームがあります。

一部のフレームでは、コンテンツをスクロールしたい (または少なくともマウスホイール イベントを処理したい)。

私は次のことを試しました:

フレームごとに 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 では、フォーカスを受け取るコントロールは、マウスホイール イベントを送信したいフレームを保持するパネルです。

簡単に言えば、マウスホイールイベントをマウスカーソルが上にある一番上のコントロールに向けるにはどうすればよいですか(カーソルがどのフレーム/親/フォームなどに関係なく)?

4

1 に答える 1

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;
于 2012-09-10T04:27:03.867 に答える