2014-01-08 1 views
4

D7을 TreeView (VirtualTreeView 아님)와 함께 사용합니다. 어떻게 노드 높이를 변경하여 OwnerDraw를 사용하고 노드 직사각형에 3 줄 (또는 5 줄 이상)의 "줄"텍스트를 그립니 까?TreeView 노드 높이를 변경하여 노드에 3 개의 선을 그리는 방법

그래서 나무는 다음과 같이한다 (노드 + 2 개 노드가 표시됩니다 루트, AAA와 BBB) :

[+] Root node 
| 
| [aaa1 
|--[aaa2222 
| [aaa333 
| 
| [bbb1 
|--[bbb2222 
| [bbb333 
| 
... 

내가 소유자 그리기를 사용하는 방법을 알고있다. 그러나 키가 큰 노드를 사각형으로 만드는 법을 모릅니다.

+1

['a proof'] (http://pastebin.com/3LDeHcnX) 가능하지만 그렇게하지 말라고 제안합니다. 예를 들어 다음과 같은 더 나은 컨트롤을 학습하는 데 투자 할 수있는 많은 작업이 있습니다. VirtualHreeView는 노드 높이를 얻기위한 OnMeasureItem 이벤트를 내장하고 있습니다. – TLama

+1

스 니펫에 감사드립니다. 나는 그것을 검사 할 것이다. – Prog1020

+0

@TLama, a) 일반적인 항목 삭제 및 열거 및 일반적인 항목 추가 (일부 항목은 보통, 일부 항목은 키가 크다)와 호환됩니까? b) Objects 속성을 사용하여 TObject와 같은 3x 항목을 추가 할 수 있습니까? – Prog1020

답변

5

가장 간단한 방법은 노드가 트리보기에 이미 추가 된 경우 노드 높이를 설정하는 것입니다. 이렇게하면 원래 VCL 제어 코드를 수정하지 않아도됩니다. 당신이해야 할 일은 iIntegral 구조체의 기본 노드 높이의 배수를 나타내는 TVITEMEX 구조체를 설정하는 것입니다. 이 높이를 픽셀 단위로 설정해야하는 경우 TVM_SETITEMHEIGHT 메시지를 보내고 기본 노드 높이를 1 픽셀로 설정하여 기본 노드 높이를 설정해야하지만 트리 뷰의 모양이 손상됩니다. 기본적으로 3 배 이상 높은 것으로

procedure SetNodeHeight(Node: TTreeNode; Integral: Integer); 
var 
    ItemEx: TTVItemEx; 
begin 
    if not Node.Deleting then 
    begin 
    ItemEx.mask := TVIF_HANDLE or TVIF_INTEGRAL; 
    ItemEx.hItem := Node.ItemId; 
    ItemEx.iIntegral := Integral; 
    TreeView_SetItem(Node.Handle, ItemEx); 
    end; 
end; 

그리고 노드를 설정하기위한 가능한 용도 : 여기서

기본 노드 높이 Integral 배의 높이까지 Node 매개 변수에 의해 지정된 노드를 설정하는 절차 노드 높이 :

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Node: TTreeNode; 
begin 
    Node := TreeView1.Items.AddChild(nil, 'Node 3 times higher than default'); 
    SetNodeHeight(Node, 3); 
end; 

원본 VCL 트리 뷰 클래스를 이와 같은 코드로 확장 할 수는 있지만 계속 사용하겠습니다.

+3

노드 integrals, 감사에 대해 좋은. –

관련 문제