TreeView CommonController 사용시 주의할 점

IT/Programming/WinAPI 2013. 9. 6. 12:57

1. TreeView_DeleteItem() 을 사용시, TreeView_DeleteItem(hTree, NULL); 처럼 HTREEITEM 인자에 NULL 값을 주면 전체 노드가 삭제된다. 이게 왜 주의할 점이냐면, TreeView_DeleteItem(hTree,TreeView_GetChild(hTree, Node)); 처럼 사용할 경우, Node의 자식 노드가 존재하지 않을 경우 TreeView_GetChild() 가 NULL을 리턴한다. 즉, 의도하지 않게 전체 노드가 삭제될 수 있다는 이야기다.

 

삭제를 위한 반복문에서 이 경우를 신경쓰지 않고 코딩을 하면 이런 버그를 만날 수 있다.

 

물론 이를 방지하기 위해서는 다음과 같이 자식 노드가 존재하는지를 미리 체크해주는 루틴을 넣어주면 된다.

 

if( NULL != TreeView_GetChild(hTree, Node)) {
    TreeView_DeleteItem(hTree, TreeView_GetChild(hTree,Node));
}

 

 

2. TreeView_GetItem() 을 사용하여 노드의 텍스트를 가져올 때, cchTextMax도 설정해주어야 한다.

ex)

  TVITEM tvi;

  char buf[25];

tvi.hItem = Node;

tvi.mask = TVIF_TEXT;

tvi.cchTextmax = 20;

tvi.pszText = buf;

TreeView_GetItem(hTree, &tvi);

 

3. 어지간하면 TreeView_Expand() 는 맨 마지막에.

TreeView에 데이터를 넣다 보면 여기 저기 갖가지 부모 노드에 자식 노드를 넣어야 하는 경우가 있다. 이럴 경우 노드 처리 작업을 모두 진행한 후에 TreeView_Expand() 를 해줘야지 해당 노드가 제대로 펼쳐진다. 즉, 미리 TreeView_Expand() 명령을 때려놓고 노드 삽입/삭제 작업을 진행하면 Expand가 풀려버리게 된다는 말이다.

설정

트랙백

댓글