gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:34:15 25 4
gpt4 key购买 nike

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

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;

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

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

尝试 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;

尝试 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;

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

最佳答案

鼠标滚轮消息被传播到接收它们的控件的父链,直到它被处理。因此,在滚动框中实际处理它们的地方将 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;

关于delphi - 抑制特定控件上的鼠标滚动事件,但不抑制其父控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35735377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com