我正在添加对鼠标滚轮移动的支持到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;
Run Code Online (Sandbox Code Playgroud)
Dav*_*vid 23
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;
Run Code Online (Sandbox Code Playgroud)
这将让你知道它是否在控件内.
从它的外观来看,你是用鼠标滚轮实现滚动?如果是的话,不要忘记打电话SystemParametersInfo
与SPI_GETWHEELSCROLLLINES
或可能,如果它在你的Delphi的版本,Mouse.WheelScrollLines
以找出多少行每增加鼠标滚轮滚动.这对您的应用程序意味着什么可能取决于您在滚动框中的内容.
如果你打算同时实现中间点击和拖动滚动(我在这里推测,这远远超过你所询问的),你可能想要在鼠标离开控件或表格之后获得鼠标事件,直到例如,用户可以按下按钮.如果是这样,看看SetCapture
和ReleaseCapture
和这篇文章.(那篇文章使用那些来查看鼠标是否在控件上(那里,一个表单)虽然我认为我上面编写的代码是解决这个特定问题的更好的解决方案 - 重点是它们对于获取鼠标信息很方便,即使鼠标不在你的表格或控制之上.)
(编辑:我刚刚注意到Delphi 2010的TMouse
包含这些API调用的属性,WheelScrollLines
并且Capture
.我不确定它们最近是如何被添加的 - 我可能之前没有注意到它们 - 但是假设它们是新的 - 并且因为你不说你用的是什么版本的Delphi的我离开了上面的文字和WinAPI的引用.如果您使用的是最新版本看看该TMouse
文件.)
归档时间: |
|
查看次数: |
10043 次 |
最近记录: |