抑制特定控件上的鼠标滚动事件,但不抑制其父控件?

Jer*_*dge 3 delphi scroll combobox mousewheel

我有一个嵌入滚动框内的表单。我在滚动框中实现滚动,如下所示:

procedure TfrmPO.sbItemsMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  sbItems.Perform(WM_VSCROLL, SB_PAGEDOWN, 0);
end;

procedure TfrmPO.sbItemsMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  sbItems.Perform(WM_VSCROLL, SB_PAGEUP, 0);
end;
Run Code Online (Sandbox Code Playgroud)

这很好地完成了任务,但是此表单中还有许多组合框控件。如果焦点位于其中之一,它也会滚动该组合框中的项目。所以我需要禁用这些效果。

我已经尝试了两种实际上有效的解决方案,但是这两种解决方案也引入了一个新问题:父滚动框永远不会收到消息,因此不会根据需要滚动。如果焦点位于另一个控件中,则父控件会滚动,但如果焦点位于组合框中,则不会滚动。

尝试1:

procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  if Screen.ActiveControl is TComboBox then Handled := True;
end;
Run Code Online (Sandbox Code Playgroud)

尝试2:

type
  TComboBox = class(Vcl.StdCtrls.TComboBox)
  protected
    function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; override;
  end;

.....

{ TComboBox }

function TComboBox.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;
  MousePos: TPoint): Boolean;
begin
  Result:= True;
end;
Run Code Online (Sandbox Code Playgroud)

如何在特定控件中禁用鼠标滚轮滚动而不在其父控件上禁用它?

Ser*_*yuz 5

鼠标滚轮消息被传播到接收它们的控件的父链,直到它被处理。因此,Handled在您实际处理它们的地方(滚动框中)设置为 true。不要将任何消息处理程序放在其他地方,以便将消息发送到父级。

procedure TfrmPO.sbItemsMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  Handled := True;
  sbItems.Perform(WM_VSCROLL, SB_PAGEDOWN, 0);
end;
Run Code Online (Sandbox Code Playgroud)