使用RTL布局时如何通过命中测试获取树视图项?

2024-03-26

描述:

在从右到左阅读模式(RTL)下有树视图,如何在仅知道单击坐标的情况下获取被单击的节点?这是一个插入类,它使树视图使用 RTL 显示,并包含一个单击处理程序,您可以在其中看到问题:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, CommCtrl;

type
  TTreeView = class(ComCtrls.TTreeView)
  protected
    procedure CNNotify(var Msg: TWMNotify); message CN_NOTIFY;
    procedure CreateParams(var Params: TCreateParams); override;
  end;

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TTreeView }

procedure TTreeView.CNNotify(var Msg: TWMNotify);
var
  Node: TTreeNode;
  Point: TPoint;
begin
  inherited;
  if Msg.NMHdr.code = NM_CLICK then
  begin
    Point := ScreenToClient(Mouse.CursorPos);
    Node := GetNodeAt(Point.X, Point.Y);
    if Assigned(Node) then
      ShowMessage('This message never shows...');
  end;
end;

procedure TTreeView.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.Style := Params.Style or TVS_RTLREADING;
  Params.ExStyle := Params.ExStyle or WS_EX_LAYOUTRTL or WS_EX_RIGHT;
end;

{ TForm1 }    

procedure TForm1.FormCreate(Sender: TObject);
var
  Node: TTreeNode;
begin
  Node := TreeView1.Items.AddChild(nil, 'Item 1');
  TreeView1.Items.AddChild(Node, 'SubItem 1');
end;

end.

这段代码的问题(或者更好地说是 RTL 模式下的树视图)是,当您单击节点(或任何位置)时,GetNodeAt http://docwiki.embarcadero.com/Libraries/XE3/en/Vcl.ComCtrls.TCustomTreeView.GetNodeAt方法永远不会返回有效节点(总是nil)。对于那些没有 Delphi 的人来说GetNodeAt http://docwiki.embarcadero.com/Libraries/XE3/en/Vcl.ComCtrls.TCustomTreeView.GetNodeAt方法内部调用TreeView_HitTest http://msdn.microsoft.com/en-us/library/windows/desktop/bb773897%28v=vs.85%29.aspx当树视图处于 RTL 模式时,返回的宏NULL就像不会有任何物品一样。我将通过以下方式获得的坐标传递给该宏GetCursorPos http://msdn.microsoft.com/en-us/library/windows/desktop/ms648390%28v=vs.85%29.aspx相对于控制计算的函数ScreenToClient http://msdn.microsoft.com/en-us/library/windows/desktop/dd162952%28v=vs.85%29.aspx功能。

问题:

我的问题是,如何让单击的节点只知道鼠标坐标?如何在RTL模式下使用树视图进行命中测试?例如,我是否应该从右侧计算鼠标水平位置,如果是,如何计算?


From ScreenToClient http://msdn.microsoft.com/en-us/library/windows/desktop/dd162952%28v=vs.85%29.aspx文档:

不使用屏幕到客户端当处于镜像情况时,即当 从左到右布局更改为从右到左布局。反而, 使用MapWindowPoints http://msdn.microsoft.com/en-us/library/windows/desktop/dd145046%28v=vs.85%29.aspx。有关详细信息,请参阅“窗口布局和 窗口功能中的“镜像”。

更正后的代码可能类似于:

  ..
  Point := Mouse.CursorPos;
  MapWindowPoints(0, Handle, Point, 1);
  Node := GetNodeAt(Point.X, Point.Y);
  ..

另请参阅:窗口布局和镜像 http://msdn.microsoft.com/en-us/library/windows/desktop/ms632599%28v=vs.85%29.aspx#layout_mirroring

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用RTL布局时如何通过命中测试获取树视图项? 的相关文章

随机推荐

  • nltk 无法找到 mace4

    在执行下面的代码时 我收到了如上所述的错误 我从以下位置下载了所需的包http www cs unm edu mccune prover9 download http www cs unm edu mccune prover9 downlo
  • 翻译字符串作为 Laravel 中的键

    我阅读了有关翻译字符串的文档检索翻译字符串 https laravel com docs 5 4 localization retrieving translation strings但不知何故我不明白如何应用它 假设我想在视图中渲染pos
  • 使UIImage符合NSCopying协议

    问题很简单 我需要一个符合 NSCopying 协议的 UIImage 但我完全不知道从哪里开始实现这一点 你有什么指示可以帮助我吗 提前致谢 id copyWithZone NSZone zone return UIImage alloc
  • SQL方法用单个空格替换重复空格

    有没有更优雅的方法来做到这一点 我想用单个空格替换重复的空格 declare i int set i 0 while i lt 20 begin update myTable set myTextColumn replace myTextC
  • 使用路径样式 amazon aws sdk go

    我在我的应用程序中使用一些 aws sdk go 功能 它会创建要请求的 DNS 样式主机 例如somebucket mys3 com 但我有一些 DNS 问题 希望以路径方式接收请求 例如mys3 com somebucket 如何配置
  • 尝试在 Javascript (ES5) 中实现 OPP 继承的简单方法

    只是出于好奇 我在 Javascript 中玩弄原型继承和 OOP 继承 大多数结果涉及用函数模拟 类 和 扩展 概念 而其他结果则使用原型和构造函数 我写了这段代码 function Warrior weaponName var weap
  • Android:“BadTokenException:无法添加窗口;您的活动正在运行吗?”在 PreferenceActivity 中显示对话框

    我想寻求一些帮助 在我的应用程序中 我只有一个活动 一个PreferenceActivity 不需要其他 它只是一个简单的后台同步应用程序 所以PrefsActivity是主 启动器 用户设置首选项后 检查checkBoxPreferenc
  • Java 和 PostgreSQL 之间的“坏记录 MAC”SSL 错误

    我们遇到了 Java 应用程序和 PostgreSQL 8 3 服务器之间随机断开连接的问题 并出现 坏记录 MAC SSL 错误 我们两边都运行 Debian Lenny 在客户端 我们看到 main WRITE TLSv1 Applic
  • 如何获取整个月的天数

    我正在创建全年日历 如何在 Flutter 中获取该月的天数 例如 一月 gt 31 二月 gt 28 29 按年 三月 gt 31 依此类推 Using date1 difference date2 inDays 是不正确的 对于某些日期
  • 从类和 javadoc 生成代码存根

    有人熟悉生成代码存根的工具吗具有有意义的名称来自类和javadoc 真正的问题应该是 我的类没有调试信息和匹配的 javadoc 但我的 IntelliJ IDEA 8 0 1 拜托 没有 IDE 战争 没有考虑 javadoc 并向我显示
  • 可以在单个进程中在 JNI 中创建多个 JVM 吗? [复制]

    这个问题在这里已经有答案了 我有一个在单个进程中运行并允许使用模块的 C 框架 我想添加的一种类型的模块是加载 JAR 然后调用其中特定的预定义函数的模块 根据用户的需要 可以有任意数量的模块同时运行 这就提出了一个问题 每个模块是否可以使
  • GCC NRVO/RVO 警告

    有没有warning 这让我们知道是否NRVO RVO执行与否 在GCC 我找到 fno elide constructors关掉NRVO RVO but NRVO RVO有其发生的条件 有时不发生 有必要知道是否NRVO RVO当额外的复
  • 与多个属性共享枚举声明值

    我想要一个具有多个属性的类 可以用数值保存工作日 summary weekday integer collection weekday integer 我想我可以将整数映射到值使用枚举 http edgeapi rubyonrails or
  • ActiveModel 序列化器:运行时有条件吗?

    我使用rails 5 0 1 和active model serializers 0 10 2 我想以某种方式有条件地序列化has many协会 class Question lt ApplicationRecord has many re
  • 如何创建或生成 .mlpd 文件以在 xamarin profiler 中检查应用程序性能

    你好 Xamarin 团队 我正在 Visual Studio 2017 社区中处理 Xamarin 表单 我想检查 Xamarin Profiler 中的应用程序性能 为此 我需要创建一个 mlpd 来检查 Xamarin Profile
  • 单击链接时使用 jQuery/Javascript 更改下拉选项

    假设我有以下链接和下拉菜单 a href contact Send a mail to mother a a href contact Send a mail to father a a href contact Send a mail t
  • 在 Windows 上非侵入式解锁文件

    有没有办法使用 Python 脚本在 Windows 上解锁文件 该文件被另一个进程独占锁定 我需要一个不终止或中断锁定过程的解决方案 我已经看过了门户锁 http code activestate com recipes 65203 一种
  • 在 Eclipse 中重新启动应用程序

    我正在使用 Eclipse Juno 开发一个独立服务器 不是战争 我将它作为 Java 应用程序从 Eclipse 运行 在进行一些代码更改后 我想停止当前正在运行的服务器并再次启动它 我每天这样做几十次 我目前的做法如下 转到 调试 选
  • 如何创建具有自定义外设和内存映射的 QEMU ARM 机器?

    我正在为 Cortex M3 cpu 编写代码 并且正在使用以下命令执行单元测试qemu arm二进制 现在一切都很好 但我想知道我是否能够使用测试整个系统qemu system arm 我的意思是 我想为 qemu 编写自定义 机器 我将
  • 使用RTL布局时如何通过命中测试获取树视图项?

    描述 在从右到左阅读模式 RTL 下有树视图 如何在仅知道单击坐标的情况下获取被单击的节点 这是一个插入类 它使树视图使用 RTL 显示 并包含一个单击处理程序 您可以在其中看到问题 unit Unit1 interface uses Wi