gpt4 book ai didi

delphi - 鼠标滚轮将消息发送到错误的控件

转载 作者:行者123 更新时间:2023-12-03 15:14:07 30 4
gpt4 key购买 nike

我使用 Windows XE2、TVirtualStringTreeTComboBox 作为内置编辑器。

当我将 TComboBox 直接放置在表单上时,在运行时我可以下拉列表,并且鼠标滚轮可以上下滚动列表中的项目(根据需要)。但是,当 TComboBox 在运行时由 TVirtualStringTree 作为就地编辑器创建时,即使新创建的组合框具有焦点,鼠标滚轮的 WM_MOUSEWHEEL 消息被发送到树控件而不是组合框。

这很明显,因为组合框下拉列表中的项目不会滚动。相反,组合框后面的树控件会滚动。组合框的固定部分随树移动,但下拉列表与组合框的固定部分断开并且不会移动(如图所示)。

Example of how the tree control scrolled behind the drop-down list

在这两种情况下,TComboBox.Style 均设置为 csDropDownList。当组合框被创建为树的就地编辑器时,它是这样完成的:

FCBox := TComboBox.Create(TreeControl);
FCBox.Visible := False;
FCBox.Parent := TreeControl;
// ... add items to combo box ...
FCBox.Visible := True;
FCBox.SetFocus;
FCBox.DroppedDown := True;

鼠标悬停在哪里并不重要。它可以直接位于组合框下拉列表中的项目上方,并且后台的树控件仍然是滚动的。滚动组合框中项目的唯一方法是使用其滚动条。

什么会导致焦点控件的父级接收鼠标滚轮消息而不是控件本身(在本例中为 TComboBox)?

最佳答案

VirtualTrees.pasTBaseVirtualTree 类中包含以下声明:

private
procedure CMMouseWheel(var Message: TCMMouseWheel); message CM_MOUSEWHEEL;

组件作者捕获了鼠标滚轮消息,以便他可以先垂直滚动,然后水平滚动。自定义代码是鼠标滚轮消息被发送到 TVirtualStringTree 而不是 TComboBox 的原因。我注释掉了他的代码,TComboBox 下拉列表按预期滚动。

由于我确实不想删除 TBaseVirtualTree 代码,因此我使用以下代码创建了自己的 TMyComboBox 来用作就地编辑器。现在,滚动在下拉列表和树控件中都可以正常工作。

interface

type
TMyCombBox = class(TComboBox)
private
procedure CMMouseWheel(var Message: TCMMouseWheel); message CM_MOUSEWHEEL;
end;

implementation

procedure TMyComboBox.CMMouseWheel(var Message: TCMMouseWheel);
begin
if DoMouseWheel([], Message.WheelDelta, SmallPointToPoint(Message.Pos)) then
Message.Result := 1;
end;

这会在将 CM_MOUSEWHEEL 消息传递给树控件之前捕获该消息,并将其交给 TControl.DoMouseWheel() 方法进行处理。

关于delphi - 鼠标滚轮将消息发送到错误的控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18388074/

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