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)
如何在特定控件中禁用鼠标滚轮滚动而不在其父控件上禁用它?
鼠标滚轮消息被传播到接收它们的控件的父链,直到它被处理。因此,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)