You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取控件内鼠标指针坐标并修复TCheckListBox选中偏差问题

修复TCheckListBox鼠标位置项选中不准确的问题

原代码的核心问题是坐标转换错误,以及ItemAtPos的参数使用不当,导致选中的项与鼠标实际位置不匹配。

修复后的代码

var
  ClickedItem: Integer;
  CategoryFilter: TCheckListBox;
  ClientPos: TPoint;
begin
  CategoryFilter.CheckAll(cbUnchecked, False, False);
  // 将屏幕坐标转换为CheckListBox的客户区坐标
  ClientPos := CategoryFilter.ScreenToClient(Mouse.CursorPos);
  // 仅当鼠标确实落在某一项区域内时才返回对应索引
  ClickedItem := CategoryFilter.ItemAtPos(ClientPos, False);
  if ClickedItem > -1 then
    CategoryFilter.Checked[ClickedItem] := True;
end;

修复说明

  • 坐标转换修正:原代码用Mouse.CursorPos.Subtract(CategoryFilter.ClientOrigin)计算客户区坐标,这种方式无法处理控件的滚动偏移(比如CheckListBox滚动后,客户区可见区域的原点已经偏移)。ScreenToClient是Delphi官方提供的可靠转换方法,会自动处理滚动、容器嵌套等场景,得到准确的客户区坐标。
  • ItemAtPos参数调整:将第二个参数从True改为False,避免当鼠标不在任何项的区域内时,返回“最近的项”导致误选,确保只有鼠标正上方的项才会被选中。

内容的提问来源于stack exchange,提问作者Wolfgang Bures

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:04:50