gpt4 book ai didi

delphi - 使用RTL布局时如何通过 HitTest 获取 TreeView 项?

转载 作者:行者123 更新时间:2023-12-03 14:46:40 25 4
gpt4 key购买 nike

描述:

在从右到左阅读模式(RTL)下有一个 TreeView ,如何在仅知道单击坐标的情况下获取被单击的节点?这是一个插入类,它使 TreeView 使用 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 模式下的此类 TreeView )是,当您单击节点(或任何位置)时,GetNodeAt方法永远不会返回有效节点(始终nil)。对于那些没有 Delphi 的人,GetNodeAt方法内部调用 TreeView_HitTest当 TreeView 处于 RTL 模式时,该宏会返回 NULL,就像不存在任何项目一样。我将通过 GetCursorPos 获得的坐标传递给该宏。相对于 ScreenToClient 的控制计算的函数功能。

问题:

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

最佳答案

来自ScreenToClient文档:

Do not use ScreenToClient when in a mirroring situation, that is, when changing from left-to-right layout to right-to-left layout. Instead, use MapWindowPoints. For more information, see "Window Layout and Mirroring" in Window Features.

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

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

另请参阅:Window Layout and Mirroring

关于delphi - 使用RTL布局时如何通过 HitTest 获取 TreeView 项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13017111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com