DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: a12315
今日帖子: 53
在线用户: 11
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2020/3/1 22:00:27
标题:
很妖的问题,鼠标滚轮只在左上格里面起作用,其它地方无效 浏览:910
加入我的收藏
楼主: 鼠标滚轮只在左上格里面起作用,其它地方无效。

测试平台:WIN10X64 + RS10.3.3

那位高手可以解释下,是什么原因?
此帖子包含附件:dbyoung_202031215955.zip 大小:323.1K
----------------------------------------------
武汉天气不好
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2020/3/1 22:02:40
1楼: 下个断点在: MousePoint.X := LOWORD(Message.lParam) 上
就可以发现,鼠标滚轮,只有在左上格中,才会触发,其它地方触发不了。

妖精了。
----------------------------------------------
武汉天气不好
作者:
男 abcjingtong (jingtong) ★☆☆☆☆ -
普通会员
2020/3/1 22:41:59
2楼: win7 64位 10.2.3测试4个格都正常。估计是失效时窗体没有焦点,可以滚轮前点下窗体试试。
----------------------------------------------
18114532@qq.com
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2020/3/1 22:46:49
3楼: 点了窗体了,反复测试过了。

WIN7可以?明天试试WIN7。
----------------------------------------------
武汉天气不好
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2020/3/2 8:45:57
4楼: 在我的 WIN7X64 + RS10.3.3 上,问题依旧。

是 RS 版本问题?
手头没有 10.2.3 版本。没能测试。

有其他朋友遇到和我一样的情况吗?
----------------------------------------------
武汉天气不好
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
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/
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2020/3/2 19:39:34
6楼: 这个包含 EXE, WIN10X64 + RS10.3.3 编译。


在我的机器上,只有鼠标在左上格滚动时,标题栏才会发生变化。其它地方都不会。
此帖子包含附件:dbyoung_202032193922.zip 大小:1.31M
----------------------------------------------
武汉天气不好
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
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/
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2020/3/3 13:39:41
8楼: WIN7X64 + XE2 问题依旧。

这是系统的问题,还是 Delphi 的问题,还是代码有问题?
----------------------------------------------
武汉天气不好
作者:
男 abcjingtong (jingtong) ★☆☆☆☆ -
普通会员
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
此帖子包含附件:abcjingtong_20203323579.rar 大小:924.1K
----------------------------------------------
18114532@qq.com
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2020/3/4 7:04:52
10楼: @abcjingtong:
在 WIN7X64 上,一样只在左上格里面起作用,其它地方无效。
----------------------------------------------
武汉天气不好
作者:
男 abcjingtong (jingtong) ★☆☆☆☆ -
普通会员
2020/3/4 9:38:27
12楼: 知道是什么原因了,是因为你取的坐标是相对桌面左上角的,不是你的窗体左上角的,你可以在窗体左上角的地方滚轮,会发现坐标值挺大的。
----------------------------------------------
18114532@qq.com
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
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的高手能指点一下吗?
----------------------------------------------
武汉天气不好
作者:
男 abcjingtong (jingtong) ★☆☆☆☆ -
普通会员
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
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行132.8125毫秒 RSS