Delphi 如何在TCXCOMBOX中抑制鼠标滚轮

Delphi 如何在TCXCOMBOX中抑制鼠标滚轮,delphi,combobox,mousewheel,Delphi,Combobox,Mousewheel,我需要为表单上的所有组合组件禁用鼠标滚轮滚动项。 最好的办法是或多或少有一个通用的解决方案,因为表单的设计可能会发生变化,如果新的组合组件被忽略而不需要对源代码进行任何额外的工作,那就更好了。 我有两种组合:TComboBox和TcxComboBox(来自DevExpress ExpressBars套装)。 我试着走这条路: procedure TSomeForm.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: In

我需要为表单上的所有组合组件禁用鼠标滚轮滚动项。 最好的办法是或多或少有一个通用的解决方案,因为表单的设计可能会发生变化,如果新的组合组件被忽略而不需要对源代码进行任何额外的工作,那就更好了。 我有两种组合:TComboBox和TcxComboBox(来自DevExpress ExpressBars套装)。 我试着走这条路:

procedure TSomeForm.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
  var Handled: Boolean);
begin
  if (Screen.ActiveControl is TComboBox) or (Screen.ActiveControl is TcxComboBox) then
    Handled := True;
end;
它对TComboBox工作正常,但当TcxComboBox具有焦点时,此事件处理程序从未触发。 我试图在表单级别捕获相应的消息,如下所示:

procedure TSomeForm.WndProc(var m: TMessage);
begin
  if (m.Msg = WM_VSCROLL) or (m.Msg = WM_HSCROLL) or (m.msg = WM_Mousewheel) then
    m.Msg := 0;
  inherited;
end;
但是这样的消息永远不会到达这个处理程序。 我尝试直接禁用TcxComboBox的鼠标滚轮处理,因为它具有以下属性:

procedure TSomeForm.FormCreate(Sender: TObject);
begin
  cxComboBox1.Properties.UseMouseWheel := False;
end;
但它不起作用,仍然可以用鼠标滚轮滚动项目。我发布了这个问题的支持票,但即使他们在下一个版本中修复了它,我现在也需要一些解决方案


有什么想法吗,也许有人以某种方式解决了它?

您可以继承自己的组件,或者使用插入器类覆盖
DoMouseWheel
,而不是挂接表单。您可以将处理绑定到其他属性上

type
  TcxComboBox = Class(cxDropDownEdit.TcxComboBox)
    function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; override;
  private
    FUseMouseWheel: Boolean;
  public
    Property UseMouseWheel: Boolean Read FUseMouseWheel Write FUseMouseWheel;
  End;

  TComboBox = Class(Vcl.StdCtrls.TComboBox)
    function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean; override;
  private
    FUseMouseWheel: Boolean;
  public
    Property UseMouseWheel: Boolean Read FUseMouseWheel Write FUseMouseWheel;
  End;

  TForm3 = class(TForm)
    ComboBox1: TComboBox;
    cxComboBox1: TcxComboBox;
    cxComboBox2: TcxComboBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}
{ TComboBox }

function TComboBox.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean;
begin
 if FUseMouseWheel then inherited
 else Result := true;
end;

{ TcxComboBox }

function TcxComboBox.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint): Boolean;
begin
 if FUseMouseWheel then inherited
 else Result := true;

end;

procedure TForm3.FormCreate(Sender: TObject);
begin
    cxComboBox2.UseMouseWheel := true;
end;

我甚至不需要UseMouseWheel属性,因为我只需要在这个表单中禁用它。所以你是对的,它很简单,也很有效。谢谢大家!@特拉玛:我不知道,如果我已经接受了答案,它是可以投票的。现在向上投票。:)这就产生了两种导致不良副作用的解决方案。我需要禁用此滚动的全部原因是因为它的父对象位于滚动框中,而我需要鼠标滚轮来滚动它。但是,引入此解决方案(以及另一种解决方案)也会导致其父级无法捕获滚动事件。这会导致两种解决方案产生不希望的副作用。我需要禁用此滚动的全部原因是因为它的父对象位于滚动框中,而我需要鼠标滚轮来滚动它。但是,引入此解决方案(以及另一种解决方案)也会导致其父级无法捕获滚动事件。