2012-01-17 1 views
1

StateImage의 위치를 ​​Winforms TreeView의 TreeNode에 대한 IndexImage의 위치로 전환 할 수 있는지 알고 싶습니다.Winforms TreeView 컨트롤에서 TreeNode에 대한 StateImage 및 IndexImage 위치를 바꿈

설명을 위해 아래 이미지를 참조하십시오.

A TreeNode with a StateImage and the bottom TreeNode without a StateImage

제의 TreeNode는 stateImage을 가지며, 두 번째는하지 않는다.

제 목표는 모든 IndexImages를 왼쪽으로 정렬하고 StateImage (있는 경우)를 IndexImage의 오른쪽으로 정렬하는 것입니다. 나는 내가하는 OwnerDraw에 나무 DrawMode을 설정하고의 OnPaint를 무시한다고 생각

resulting tree with IndexImages aligned left

:

결과 나무는 같을 것이다. 나는 this msdn 링크를 읽었지만 이미지를 그리는 것에 대해서는 아무 것도 말하지 않았다. 나는 정말로 어떻게 진행해야할지 모른다. 당신이 제공 할 수있는 도움과 코드 (C#이나 VB.net)는 대단히 감사하겠습니다.

많은 감사합니다.

답변

1

예, 사용자 지정 그리기가 필요합니다.

TreeView1.DrawMode = TreeViewDrawMode.OwnerDrawAll 

그러면 DrawNode 이벤트를 처리해야합니다. TreeView.DrawNode Event

DrawNode 이벤트의 DrawTreeNodeEventArgs 매개 변수에는 이미지에서 텍스트로 페인트하는 데 사용할 수있는 그래픽 개체가 있습니다.

물론 일단 사용자 정의로 이동하면 모든 것을 그릴 책임이 있습니다 (불행히도). 적절한 TreeView 글리프 가져 오기에 관해서는 VisualStyles을 참조하십시오.

간단한 그림 :

Private Sub TreeView1_DrawNode(ByVal sender As Object, ByVal e As DrawTreeNodeEventArgs) Handles TreeView1.DrawNode 
    Dim nodeLeft As Integer = (e.Node.Level * 16) + 16 
    e.Graphics.DrawImage(ImageOne, nodeLeft, e.Bounds.Top) 
    e.Graphics.DrawImage(ImageTwo, nodeLeft + 16, e.Bounds.Top) 
    e.Graphics.DrawString(e.Node.Text, Me.Font, Brushes.Black, nodeLeft + 32, e.Bounds.Top) 
End Sub 

이 예는 트리 컨트롤 및 선택 상태를 그리는 코드가 누락하지만이 개 이미지와 노드의 텍스트를 보여줍니다. 사용자 정의 그리기 TreeViews는 많은 작업입니다.

+0

답변 해 주셔서 감사합니다. 어제 밤에 준 링크는 매우 유용했습니다. 상태 이미지로 자식 노드 그리기를 처리했습니다. 다른 모든 노드의 경우 e.DrawDefault = True로 설정합니다. 이것은 내 문제를 해결하고 작성해야하는 코드의 양을 줄였습니다. 남아있는 유일한 문제는 상태 이미지가있는 선택된 하위 노드의 강조 표시를 그리는 것입니다. 나는 SystemBrushes.Highlight와 FillRectangle를 사용했지만 일관된 모습을 가지고 있지 않습니다. 영감을 얻기 위해 업데이트에서 제공 한 VisualStyles 링크를 살펴 보겠습니다. – mazrabul