gpt4 book ai didi

delphi - 如何判断鼠标光标是否在控件内

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

我正在向 TScrollBox 添加对鼠标滚轮移动的支持(使用 FormMouseWheel 过程),并且我需要确定鼠标是否位于组件内部。

基本上,我需要确定鼠标是否在 TScrollBox 内,以便我相应地处理滚动代码。

知道如何做到这一点吗?

编辑:这是代码(包括这个问题的答案),因为它可能对其他人有帮助:

   procedure TForm1.FormMouseWheel(Sender: TObject;
Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint;
var Handled: Boolean);
var
Msg: Cardinal;
Code: Cardinal;
I, ScrollLines: Integer;

ScrollBoxCursosPos: TPoint;
begin
//position of the mouse cursor related to TScrollBox
ScrollBoxCursosPos := ScrollBox1.ScreenToClient(Mouse.CursorPos);

if (PtInRect(ScrollBox1.ClientRect, ScrollBoxCursosPos)) then
begin
Handled := True;
If ssShift In Shift Then
msg := WM_HSCROLL
Else
msg := WM_VSCROLL;

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

ScrollLines:= Mouse.WheelScrollLines * 3;
for I:= 1 to ScrollLines do
ScrollBox1.Perform(Msg, Code, 0);
ScrollBox1.Perform(Msg, SB_ENDSCROLL, 0);
end;
end;

最佳答案

Mouse.CursorPos返回屏幕坐标中的鼠标位置。您可以通过调用控件的 ScreenToClient 将其转换为“客户端”坐标,即相对于控件的坐标。方法。

所以你会有这样的代码:

var
MyPoint : TPoint;
begin
MyPoint := ScrollBox1.ScreenToClient(Mouse.CursorPos);
if PtInRect(ScrollBox1.ClientRect, MyPoint) then
begin
// Mouse is inside the control, do something here
end;
end;

这会让您知道它是否在控件内。

从外观上看,您正在使用鼠标滚轮实现滚动?如果是这样,请不要忘记调用SystemParametersInfo with SPI_GETWHEELSCROLLLINES或者可能,如果它在您的 Delphi 版本中,Mouse.WheelScrollLines找出每个鼠标滚轮增量要滚动的行数。这对您的应用意味着什么可能取决于滚动框中的内容。

如果您还计划实现中键单击并拖动滚动(我在这里推测,这远远超出了您的要求),您可能希望在鼠标离开控件后获取鼠标事件或例如,直到用户松开按钮。如果是这样,请查看SetCaptureReleaseCapturethis article 。 (那篇文章使用它们来查看鼠标是否位于控件(那里是一个表单)上,尽管我认为我上面编写的代码是针对该特定问题的更好的解决方案 - 要点是它们可以很方便地获取鼠标信息,即使当鼠标不在您的窗体或控件上。)

(编辑:我刚刚注意到 Delphi 2010 的 TMouse 具有包装这些 API 调用的属性 WheelScrollLinesCapture 。我不确定它们是最近多久添加的 - 我可能只是以前没有注意到它们 - 但假设它们是新的并且因为你没有说你正在使用什么版本的 Delphi 我将保留上面的文本和 WinAPI 引用。如果你使用的是最新版本看看 the TMouse documentation 。)

关于delphi - 如何判断鼠标光标是否在控件内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1721700/

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