delphi – Mouse-Wheel向错误的控件发送消息

delphi – Mouse-Wheel向错误的控件发送消息,第1张

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

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

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

在这两种情况下,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.pas在TBaseVirtualTree类中包含以下声明:

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

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

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

interfacetype  TMyCombBox = class(TComboBox)  private    procedure CMMouseWheel(var Message: TCMMouseWheel); message CM_MOUSEWHEEL;  end;implementationprocedure TMyComboBox.CMMouseWheel(var Message: TCMMouseWheel);begin  if DoMouseWheel([],Message.WheelDelta,SmallPointtopoint(Message.Pos)) then    Message.Result := 1;end;

这将捕获CM_MOUSEWHEEL消息,然后将其传递给树控件并将其交给TControl.DoMouseWheel()方法进行处理.

总结

以上是内存溢出为你收集整理的delphi – Mouse-Wheel向错误的控件发送消息全部内容,希望文章能够帮你解决delphi – Mouse-Wheel向错误的控件发送消息所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1271994.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存