gpt4 book ai didi

delphi - TreeView自定义绘制项

转载 作者:行者123 更新时间:2023-12-02 13:37:26 27 4
gpt4 key购买 nike

我想使用具有重新排列项目功能的 Win32 TreeView 控件,就像可以在 Windows 资源管理器的收藏夹/快速访问中一样:

image

我没有找到启用两个节点之间分隔线的选项,所以我想我必须自己绘制它。

为此,我认为必须将 NM_CUSTOMDRAW 通知与 CDIS_DROPHILITED 项目状态结合使用。但我抓不到这个。为什么?

unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
Unit2, Vcl.ComCtrls;

type
TForm1 = class(TForm)
TreeView1: TTreeView;
procedure TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
var PaintImages, DefaultDraw: Boolean);
procedure TreeView1Changing(Sender: TObject; Node: TTreeNode;
var AllowChange: Boolean);
procedure TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
private
procedure WMNotify(var Msg: TMessage); message WM_NOTIFY;
end;

var
Form1: TForm1;

implementation

uses
CommCtrl;

{$R *.dfm}

procedure TForm1.TreeView1AdvancedCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage;
var PaintImages, DefaultDraw: Boolean);
begin
if (cdsDropHilited in State) then
Write;
end;

procedure TForm1.TreeView1Changing(Sender: TObject; Node: TTreeNode;
var AllowChange: Boolean);
begin
AllowChange := Node <> TreeView1.Items[1];
end;

procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := True;

GetComCtlVersion();
end;

procedure TForm1.WMNotify(var Msg: TMessage);
begin
case (PNMHdr(Msg.LParam)^.code) of
NM_CUSTOMDRAW:
if (PNMTVCustomDraw(Msg.LParam)^.nmcd.uItemState and CDIS_NEARHOT <> 0) then
Write;
end;

inherited;
end;

end.

TreeView1AdvancedCustomDrawItem()WMNotify() 都无法到达 Write 语句。

有什么建议吗?如何在实现拖放功能时绘制节点分隔线?

我使用的是 Windows 7。

最佳答案

如果您仔细观察 Windows 资源管理器如何绘制其树节点,您会发现您感兴趣的分隔线仅在鼠标位于所拖动节点的上边缘或下边缘上方时才会绘制。当鼠标未位于目标节点的上/下边缘上方时,查看分隔线相对于目标节点的突出显示选择的位置。它们重叠。

您可以在TTreeView.OnAdvancedCustomDraw(Item)中完成同样的事情事件。检查 TreeView 的 DropTarget 是否node(当用户释放鼠标时将被放置到的节点)是当前正在绘制的节点,如果是这样则:

  • 使用 TreeView.ScreenToClient(Mouse.CursorPos) 检索客户端坐标中的当前鼠标位置.

  • 检索DisplayRect DropTarget的节点。

  • 检查鼠标坐标当前是否位于该矩形的顶部或底部几个像素内。

  • 如果是这样,请根据需要在这些坐标处绘制分隔线。

关于delphi - TreeView自定义绘制项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41763302/

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