导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2020/3/1 22:00:27
标题:
很妖的问题,鼠标滚轮只在左上格里面起作用,其它地方无效
浏览:910
加入我的收藏
楼主:
鼠标滚轮只在左上格里面起作用,其它地方无效。 测试平台:WIN10X64 + RS10.3.3 那位高手可以解释下,是什么原因?
----------------------------------------------
武汉天气不好
作者:
2020/3/1 22:02:40
1楼:
下个断点在: MousePoint.X := LOWORD(Message.lParam) 上 就可以发现,鼠标滚轮,只有在左上格中,才会触发,其它地方触发不了。 妖精了。
----------------------------------------------
武汉天气不好
作者:
2020/3/1 22:41:59
2楼:
win7 64位 10.2.3测试4个格都正常。估计是失效时窗体没有焦点,可以滚轮前点下窗体试试。
----------------------------------------------
18114532@qq.com
作者:
2020/3/1 22:46:49
3楼:
点了窗体了,反复测试过了。 WIN7可以?明天试试WIN7。
----------------------------------------------
武汉天气不好
作者:
2020/3/2 8:45:57
4楼:
在我的 WIN7X64 + RS10.3.3 上,问题依旧。 是 RS 版本问题? 手头没有 10.2.3 版本。没能测试。 有其他朋友遇到和我一样的情况吗?
----------------------------------------------
武汉天气不好
作者:
2020/3/2 19:16:40
5楼:
来个exe。。
----------------------------------------------
[alias] co = clone --recurse-submodules up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/ >http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
2020/3/2 19:39:34
6楼:
这个包含 EXE, WIN10X64 + RS10.3.3 编译。 在我的机器上,只有鼠标在左上格滚动时,标题栏才会发生变化。其它地方都不会。
----------------------------------------------
武汉天气不好
作者:
2020/3/2 23:04:32
7楼:
1909 18363.657 鼠标滚轮只在左上格里面起作用,其它地方无效。
----------------------------------------------
[alias] co = clone --recurse-submodules up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/ >http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
2020/3/3 13:39:41
8楼:
WIN7X64 + XE2 问题依旧。 这是系统的问题,还是 Delphi 的问题,还是代码有问题?
----------------------------------------------
武汉天气不好
作者:
2020/3/3 23:57:22
9楼:
在Handle := False;后面加了一行 Form1.Caption := MousePoint.X.ToString + ', ' + MousePoint.Y.ToString + ' ' + FormatDateTime('HH:mm:SS zzz', Now); 用来测试,你试试,附件是我10.2.3 win7 64编译好的exe
----------------------------------------------
18114532@qq.com
作者:
2020/3/4 7:04:52
10楼:
@abcjingtong: 在 WIN7X64 上,一样只在左上格里面起作用,其它地方无效。
----------------------------------------------
武汉天气不好
作者:
2020/3/4 9:38:27
12楼:
知道是什么原因了,是因为你取的坐标是相对桌面左上角的,不是你的窗体左上角的,你可以在窗体左上角的地方滚轮,会发现坐标值挺大的。
----------------------------------------------
18114532@qq.com
作者:
2020/3/4 12:49:53
13楼:
Vcl.Controls.pas <10028行 RS10.3.3> : function TWinControl.IsControlMouseMsg(var Message: TWMMouse): Boolean; var Control: TControl; P: TPoint; begin if GetCapture = Handle then begin if (CaptureControl <> nil) and (CaptureControl.Parent = Self) then Control := CaptureControl else Control := nil; end else Control := ControlAtPos(SmallPointToPoint(Message.Pos), False); Result := False; if Control <> nil then begin P.X := Message.XPos - Control.Left; P.Y := Message.YPos - Control.Top; Message.Result := Control.Perform(Message.Msg, Message.Keys, PointToLParam(P)); Result := True; end; end; 问题出在这个函数上。 Control.Perform(Message.Msg, Message.Keys, PointToLParam(P)); 子控件(Image)的消息派发,这里的 P 鼠标坐标,被修改为相对屏幕的坐标了,而不是子窗体(Image)相对于父窗体(Form)的坐标。 不知道这样理解是否正确。有精通VCL的高手能指点一下吗?
----------------------------------------------
武汉天气不好
作者:
2020/3/4 15:46:12
14楼:
不是被修改为相对屏幕坐标了,是本身触发IsControlMouseMsg时的坐标就是相对屏幕的,你可以看ControlAtPos里的子方法GetControlAtPos,有一句 P := Point(Pos.X - Left, Pos.Y - Top);说明在判断坐标处的控件时是转换为相对于窗口的。 而IsControlMouseMsg方法里后面的 P.X := Message.XPos - Control.Left; // Control为image,但它的Left是0,所以你得到的还是屏幕坐标
----------------------------------------------
18114532@qq.com