2017-01-20 1 views
1

を描く:ツリービューのカスタム、私はそれは、Windows Explorerのお気に入り/クイックアクセスの内側に可能であるように、アイテムを訴えるために機能してWin32のTreeViewコントロールを使用したい項目

image

私は見つけられませんでした2つのノードの間のディバイダを有効にするオプション、私は自分でそれを描く必要があると思う。

これを行うには、CDIS_DROPHILITEDアイテムの状態でNM_CUSTOMDRAW通知を使用する必要があると思います。しかし、私はこれをキャッチすることはできません。どうして?

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のエクスプローラがそのツリーノードを描画する方法をよく見ると

+2

外部画像ホストの代わりに画像にStackOverflowの組み込み機能を使用してください。 –

+0

これを行う代わりに、[VirtualTreeView](http://www.jam-software.de/virtual-treeview/)を参考にしてください。 –

+0

@BrandonStaggs「申し訳ありませんが、リクエストされたページは現在利用できないか、存在しません」というメッセージを投稿する前にURLを確認してください。 – Sami

答えて

2

を使用してい

ドラッグされているノードの端。マウスが上端または下端にないときに、ターゲットノードのハイライト選択に関連して、除算器の位置を見てください。それらは重なり合う。

TTreeView.OnAdvancedCustomDraw(Item)イベントでも同じことが達成できます。ツリービューのDropTargetノード(ユーザーがマウスを離したときにドロップされるノード)がノードが現在描かれているかどうかを確認し、もしそうならば、その後:

  • TreeView.ScreenToClient(Mouse.CursorPos)を使用して座標をクライアントで現在のマウス位置を取得。

  • DropTargetノードのDisplayRectを取得します。

  • マウス座標が現在その矩形の上端または下端にあるかどうかをチェックします。

  • もしそうなら、必要に応じてそれらの座標に分周器を描画します。

関連する問題