Delphi 如何使用鼠标滚轮对TScrollbox滚动的子按钮进行离焦

Delphi 如何使用鼠标滚轮对TScrollbox滚动的子按钮进行离焦,delphi,delphi-xe4,Delphi,Delphi Xe4,要求 动态创建的按钮(很多) 文字包装至关重要,因为事先不知道标题长度(TSpeedButton no good) 下面给出了通过鼠标滚轮滚动TScrollBox的代码,该代码驻留在表单的onmouseheel事件中。当光标停留在按钮上时,它会得到橙色(XP)矩形,而不会滚动滚动滚动框。似乎除了这个特殊情况,其他所有鼠标移动事件都存在 If WindowFromPoint( mouse.Cursorpos ) = scrlbx1.Handle Then Begin Handled := tr

要求

  • 动态创建的按钮(很多)
  • 文字包装至关重要,因为事先不知道标题长度(TSpeedButton no good)
  • 下面给出了通过鼠标滚轮滚动TScrollBox的代码,该代码驻留在表单的onmouseheel事件中。当光标停留在按钮上时,它会得到橙色(XP)矩形,而不会滚动滚动滚动框。似乎除了这个特殊情况,其他所有鼠标移动事件都存在

    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;
    

    任何解决方法都值得赞赏。

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

    If WindowFromPoint( mouse.Cursorpos ) = scrlbx1.Handle Then Begin
    
    当鼠标位于按钮上时,上述语句中的条件将不为真
    WindowFromPoint
    将返回按钮句柄,因此其余代码将不会执行

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

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


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

    请不要在标签中可用的问题标题中添加信息。标签在这里可以正常工作以提供信息,在标题中使用标签是不合适的,尤其是在方括号中(方括号在标题中也有特定含义,特别是表示[已关闭]、[保留]或[重复]问题)。谢谢,谢谢。我不知道。这个解决方案是有效的。但只有在将“Rect”识别为TRect变量之后。(level=初学者:P)'Rect'似乎被Delphi使用。