【问题标题】:How to defocus a child TButton for TScrollbox to scroll with mousewheel如何使 TScrollbox 的子 TButton 散焦以使用鼠标滚轮滚动
【发布时间】:2015-04-28 03:26:04
【问题描述】:

要求

  1. 动态创建的按钮(很多)。
  2. Wordwrap 必不可少,因为事先不知道字幕长度(TSpeedButton 不好)。

下面给出了通过鼠标滚轮滚动 TScrollBox 的代码,它位于 Form 的 OnMouseWheel 事件中。当光标在按钮上保持静止时,它会获得橙色 (XP) 矩形并且不会滚动 TScrollBox。除了这种特殊情况外,似乎所有其他鼠标移动事件都存在。

If WindowFromPoint( mouse.Cursorpos ) = scrlbx1.Handle Then Begin
  Handled := true;
  If ssShift In Shift Then
    msg := WM_HSCROLL
  Else
    msg := WM_VSCROLL;

  If WheelDelta > 0 Then
    code := SB_LINEUP
  Else
    code := SB_LINEDOWN;

  n:= Mouse.WheelScrollLines;
  For i:= 1 to n Do
    scrlbx1.Perform( msg, code, 0 );
  scrlbx1.Perform( msg, SB_ENDSCROLL, 0 );
End;

任何解决方法将不胜感激。

【问题讨论】:

  • 请不要将信息放在标签中可用的问题标题中。标签在这里正常工作以提供信息,并且在标题中使用标签是不合适的,尤其是在将它们括在方括号中时(在此处的标题中也有特定含义,专门表示[关闭],[暂停],或[重复]问题)。谢谢。
  • 谢谢。我不知道。

标签: delphi delphi-xe4


【解决方案1】:

您的问题不是按钮有焦点,而是您的代码没有考虑鼠标指针在按钮上的情况。

If WindowFromPoint( mouse.Cursorpos ) = scrlbx1.Handle Then Begin

当鼠标在按钮上时,上述语句中的条件将不成立。 WindowFromPoint 将返回按钮句柄,因此其余代码将不会执行。

您必须更正您的代码以说明鼠标可以在另一个控件上。顺便说一句,事件处理程序已经传递了鼠标位置,使用它而不是再次检索该位置 - 甚至可能是不同的位置。一个例子可以是:

GetWindowRect(scrlbx1.Handle, Rect);
if PtInRect(Rect, MousePos) then begin
  ..


焦点不是问题,VCL在父链中传播wheel消息,直到处理完毕。

【讨论】:

  • 此解决方案有效。但只有在将“Rect”标识为 TRect 变量之后。 (级别=初学者:P)
  • 'Rect' 似乎被 Delphi 使用。
猜你喜欢
  • 1970-01-01
  • 2018-05-13
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 2012-12-30
相关资源
最近更新 更多