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
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使用。