Как подавить колесо мыши в TcxComboBox

Мне нужно отключить прокрутку элементов колесиком мыши для всех комбо-компонентов в форме. Лучше всего иметь более или менее общее решение, поскольку дизайн формы может измениться, было бы неплохо, если бы новые комбо-компоненты игнорировались без какой-либо дополнительной работы с исходным кодом. У меня есть два типа комбо: TComboBox и TcxComboBox (из DevExpress ExpressBars Suit). Я пытался пойти по этому пути:

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;

Но это не работает, все еще можно прокручивать элементы колесиком мыши. Я отправил заявку в службу поддержки по этой проблеме, но даже если они исправят ее в следующем выпуске, мне нужно какое-то решение сейчас.

Есть идеи, может, кто-то решил это как-то?

1 ответ

Решение

Вместо того, чтобы подключать форму, вы можете наследовать собственные компоненты или использовать переопределение классов Interposer. 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;
Другие вопросы по тегам