트리 뷰 컨트롤 정보

트리 뷰 컨트롤은 문서의 제목, 인덱스의 항목 또는 디스크의 파일 및 디렉터리와 같은 항목의 계층적 목록을 표시하는 창입니다. 각 항목은 레이블과 선택적 비트맵 이미지로 구성되며 각 항목에는 연결된 하위 항목 목록이 있을 수 있습니다. 사용자는 항목을 클릭하여 연결된 하위 항목 목록을 확장하거나 축소할 수 있습니다.

다음 그림에서는 루트 노드, 확장된 노드 및 축소된 노드가 있는 간단한 트리 뷰 컨트롤을 보여 줍니다. 컨트롤은 선택한 항목에 대해 하나의 비트맵을 사용하고 다른 항목에 대해 또 다른 비트맵을 사용합니다.

screen shot showing five nodes in a hierarchy; the text of one node is selected, but nodes are not linked to each other by lines

트리 뷰 컨트롤을 만든 후 컨트롤에 메시지를 보내 항목을 추가, 제거, 정렬 또는 조작합니다. 각 메시지에는 메시지를 명시적으로 보내는 대신 사용할 수 있는 하나 이상의 해당 매크로가 있습니다.

이 섹션에서 설명하는 항목은 다음과 같습니다.

트리 뷰 스타일

트리 뷰 스타일은 트리 뷰 컨트롤의 모양을 제어합니다. 트리 뷰 컨트롤을 만들 때 초기 스타일을 설정합니다. GetWindowLongSetWindowLong 함수를 사용하여 트리 뷰 컨트롤을 만든 후 스타일을 검색하고 변경할 수 있습니다.

TVS_HASLINES 스타일은 다음 그림과 같이 자식 항목을 부모 항목에 연결하는 선을 그려서 트리 뷰 컨트롤 계층의 그래픽 표현을 향상시킵니다.

screen shot showing the previous arrangement, but with lines joining the nodes; the first line descends from the root node

이 스타일 자체는 계층 구조의 루트에 선을 그리지 않습니다. 이렇게 하려면 TVS_HASLINESTVS_LINESATROOT 스타일을 결합해야 합니다. 결과는 다음 그림에 나와 있습니다.

screen shot showing the previous arrangement, but with an additional horizontal line leading to the root node

사용자는 부모 항목을 두 번 클릭하여 부모 항목의 자식 항목 목록을 확장하거나 축소할 수 있습니다. TVS_HASBUTTONS 스타일이 있는 트리 뷰 컨트롤은 각 부모 항목의 왼쪽에 단추를 추가합니다. 사용자는 부모 항목을 두 번 클릭하는 대신 단추를 한 번 클릭하여 자식 항목을 확장하거나 축소할 수 있습니다. TVS_HASBUTTONS는 계층 구조의 루트에 있는 항목에 단추를 추가하지 않습니다. 이렇게 하려면 TVS_HASLINES, TVS_LINESATROOTTVS_HASBUTTONS를 결합해야 합니다. 이 스타일 조합은 다음 그림에 나와 있습니다.

screen shot showing the previous arrangement, but with expand/collapse buttons at each vertex of two lines

TVS_CHECKBOXES 스타일은 각 항목 옆에 확인란을 만듭니다. 확인란 스타일을 사용하려는 경우 트리 뷰 컨트롤을 만든 후 트리를 채우기 전에 TVS_CHECKBOXES 스타일(SetWindowLong 포함)을 설정해야 합니다. 그렇지 않으면 타이밍 문제에 따라 확인란이 선택되지 않은 것처럼 보일 수 있습니다. 다음 그림에서는 확인란 스타일을 보여 줍니다.

screen shot showing the previous arrangement, but with a checkbox next to each node; two of the checkboxes are selected

TVS_FULLROWSELECT 스타일을 사용하면 선택 강조 표시가 항목 자체가 아니라 컨트롤의 전체 너비로 확장됩니다. 다음 그림에서는 이 스타일을 보여 줍니다.

screen shot showing the original arrangement of five nodes with no lines, but the selection highlight extends the full width of the control

TVS_EDITLABELS 스타일을 사용하면 사용자가 트리 뷰 항목의 레이블을 편집할 수 있습니다. 레이블 편집에 대한 자세한 내용은 트리 뷰 레이블 편집을 참조하세요.

이러한 스타일 및 기타 스타일에 대한 자세한 내용은 트리 뷰 컨트롤 창 스타일을 참조하세요.

부모 및 자식 항목

트리 뷰 컨트롤의 모든 항목에는 연결된 자식 항목(자식 항목이라고 함) 목록이 있을 수 있습니다. 하나 이상의 자식 항목이 있는 항목을 부모 항목이라고 합니다. 자식 항목은 부모 항목 아래에 표시되며 부모 항목에 종속됨을 나타내기 위해 들여쓰기가 적용됩니다. 부모 항목이 없는 항목은 계층 구조의 맨 위에 나타나며 루트 항목이라고 합니다.

트리 뷰 컨트롤에 항목을 추가하려면 컨트롤에 TVM_INSERTITEM 메시지를 보냅니다. 메시지는 항목을 고유하게 식별하는 HTREEITEM 형식에 대한 핸들을 반환합니다. 항목을 추가할 때 새 항목의 부모 항목에 대한 핸들을 지정해야 합니다. TVINSERTSTRUCT 구조체에서 부모 항목 핸들 대신 NULL 또는 TVI_ROOT 값을 지정하면 항목이 루트 항목으로 추가됩니다.

언제든지 부모 항목의 자식 항목 목록 상태는 확장되거나 축소될 수 있습니다. 상태가 확장되면 자식 항목이 부모 항목 아래에 표시됩니다. 축소되면 자식 항목이 표시되지 않습니다. 사용자가 부모 항목을 두 번 클릭하거나, 부모에 TVS_HASBUTTONS 스타일이 있거나, 사용자가 부모 항목과 연결된 단추를 클릭하는 경우 목록이 확장 상태와 축소 상태 간에 자동으로 전환됩니다. 애플리케이션은 TVM_EXPAND 메시지를 사용하여 자식 항목을 확장하거나 축소할 수 있습니다.

트리 뷰 컨트롤은 부모 항목의 자식 항목 목록이 확장되거나 축소되려고 할 때 부모 창에 TVN_ITEMEXPANDING 알림 메시지를 보냅니다. 알림을 통해 애플리케이션은 변경을 방지하거나 자식 항목 목록의 상태에 따라 달라지는 부모 항목의 특성을 설정할 수 있습니다. 목록의 상태를 변경한 후 트리 뷰 컨트롤은 부모 창에 TVN_ITEMEXPANDED 알림 메시지를 보냅니다.

자식 항목 목록이 확장되면 부모 항목에 상대적으로 들여쓰기가 적용됩니다. TVM_SETINDENT 메시지를 사용하여 들여쓰기 양을 설정하거나 TVM_GETINDENT 메시지를 사용하여 현재 양을 검색할 수 있습니다.

트리 뷰 컨트롤은 트리 뷰 컨트롤을 만드는 프로세스의 힙에서 할당된 메모리를 사용합니다. 트리 뷰의 최대 항목 수는 힙에서 사용 가능한 메모리 양을 기반으로 합니다.

항목 레이블

일반적으로 트리 뷰 컨트롤에 항목을 추가할 때 항목 레이블의 텍스트를 지정합니다. TVM_INSERTITEM 메시지에는 레이블 텍스트가 포함된 문자열을 비롯하여 항목의 속성을 정의하는 TVITEM 구조체가 포함되어 있습니다.

트리 뷰 컨트롤은 각 항목을 저장하기 위한 메모리를 할당합니다. 항목 레이블의 텍스트는 이 메모리의 상당 부분을 차지합니다. 애플리케이션이 트리 뷰 컨트롤에서 문자열 복사본을 유지 관리하는 경우 트리 뷰에 실제 문자열을 전달하지 않고 TVITEMpszText 멤버에 LPSTR_TEXTCALLBACK 값을 지정하여 컨트롤의 메모리 요구 사항을 줄일 수 있습니다. LPSTR_TEXTCALLBACK을 사용하면 항목을 다시 그려야 할 때마다 트리 뷰 컨트롤이 부모 창에서 항목 레이블의 텍스트를 검색합니다. 텍스트를 검색하기 위해 트리 뷰 컨트롤은 NMTVDISPINFO 구조체의 주소를 포함하는 TVN_GETDISPINFO 알림 메시지를 보냅니다. 부모 창은 포함된 구조체의 적절한 멤버를 채워야 합니다.

트리 뷰 레이블 편집

사용자는 TVS_EDITLABELS 스타일이 있는 트리 뷰 컨트롤에서 항목의 레이블을 직접 편집할 수 있습니다. 사용자는 포커스가 있는 항목의 레이블을 클릭하여 편집을 시작합니다. 애플리케이션은 TVM_EDITLABEL 메시지를 사용하여 편집을 시작합니다. 트리 뷰 컨트롤은 편집이 시작될 때와 취소 또는 완료될 때 부모 창에 알립니다. 편집이 완료되면 부모 창은 적절한 경우 항목의 레이블 업데이트를 담당합니다.

레이블 편집이 시작되면 트리 뷰 컨트롤이 부모 창에 TVN_BEGINLABELEDIT 알림 메시지를 보냅니다. 이 알림을 처리함으로써 애플리케이션은 일부 레이블의 편집을 허용하고 다른 레이블의 편집을 방지할 수 있습니다. 0을 반환하면 편집이 가능하고 0이 아닌 값을 반환하면 편집이 불가능합니다.

레이블 편집이 취소되거나 완료되면 트리 뷰 컨트롤이 부모 창에 TVN_ENDLABELEDIT 알림 메시지를 보냅니다. lParam 매개 변수는 NMTVDISPINFO 구조체의 주소입니다. item 매개 변수는 항목을 식별하고 편집된 텍스트를 포함하는 TVITEM 구조체입니다. 부모 창은 새 레이블을 유지하려는 경우 항목의 레이블을 업데이트해야 합니다. 편집이 취소되면 TVITEMpszText 멤버는 0입니다.

레이블 편집 중에 일반적으로 TVN_BEGINLABELEDIT 알림 메시지에 대한 응답으로 TVM_GETEDITCONTROL 메시지를 사용하여 레이블 편집에 사용되는 편집 컨트롤에 대한 핸들을 검색할 수 있습니다. 편집 컨트롤에 EM_SETLIMITTEXT 메시지를 보내 사용자가 입력할 수 있는 텍스트의 양을 제한하거나 편집 컨트롤을 하위 클래스로 분류하여 유효하지 않은 문자를 가로채서 버릴 수 있습니다. 그러나 편집 컨트롤은 TVN_BEGINLABELEDIT가 전송된 이후에만 표시됩니다.

트리 뷰 항목 위치

항목이 TVM_INSERTITEM 메시지를 사용하여 트리 뷰 컨트롤에 추가될 때 항목의 초기 위치가 설정됩니다. 메시지에는 부모 항목에 대한 핸들과 새 항목이 삽입될 항목에 대한 핸들을 지정하는 TVINSERTSTRUCT 구조체가 포함되어 있습니다. 두 번째 핸들은 지정된 부모의 자식 항목이나 TVI_FIRST, TVI_LAST 또는 TVI_SORT 값 중 하나를 식별해야 합니다.

TVI_FIRST 또는 TVI_LAST가 지정되면 트리 뷰 컨트롤은 지정된 부모 항목에 대한 자식 항목 목록의 시작 또는 끝에 새 항목을 배치합니다. TVI_SORT가 지정되면 트리 뷰 컨트롤은 항목 레이블의 텍스트에 따라 사전순으로 자식 항목 목록에 새 항목을 삽입합니다.

TVM_SORTCHILDREN 메시지를 사용하여 부모 항목의 자식 항목 목록을 사전순으로 넣을 수 있습니다. 이 메시지에는 지정된 부모 항목에서 내려오는 자식 항목의 모든 수준도 사전순으로 정렬되는지 여부를 지정하는 매개 변수가 포함되어 있습니다.

TVM_SORTCHILDRENCB 메시지를 사용하면 정의한 조건에 따라 자식 항목을 정렬할 수 있습니다. 이 메시지를 사용할 때 두 자식 항목의 상대적 순서를 결정해야 할 때마다 트리 뷰 컨트롤이 호출할 수 있는 애플리케이션 정의 콜백 함수를 지정합니다. 콜백 함수는 비교 중인 항목에 대해 두 개의 32비트 애플리케이션 정의 값과 TVM_SORTCHILDRENCB를 보낼 때 지정하는 세 번째 32비트 값을 받습니다.

트리 뷰 항목 상태 개요

트리 뷰 컨트롤의 각 항목에는 현재 상태가 있습니다. 각 항목의 상태 정보에는 항목의 상태 이미지와 오버레이 이미지를 나타내는 이미지 목록 인덱스와 비트 플래그 집합이 포함됩니다. 비트 플래그는 항목이 선택되었는지, 사용하지 않도록 설정되었는지, 확장되었는지 등을 나타냅니다. 대부분의 경우 트리 뷰 컨트롤은 항목 선택과 같은 사용자 작업을 반영하도록 항목의 상태를 자동으로 설정합니다. 그러나 TVM_SETITEM 메시지를 사용하여 항목의 상태를 설정할 수도 있으며 TVM_GETITEM 메시지를 사용하여 항목의 현재 상태를 검색할 수 있습니다. 항목 상태의 전체 목록은 트리 뷰 컨트롤 항목 상태를 참조하세요.

항목의 현재 상태는 TVITEM 구조체의 state 멤버에 의해 지정됩니다. 트리 뷰 컨트롤은 항목을 선택하거나 항목에 포커스를 설정하는 것과 같은 사용자 작업을 반영하기 위해 항목의 상태를 변경할 수 있습니다. 또한 애플리케이션은 항목의 상태를 변경하여 항목을 사용하지 않도록 설정 또는 숨기거나 오버레이 이미지 또는 상태 이미지를 지정할 수 있습니다.

항목의 상태를 지정하거나 변경할 때 TVITEMstatemask 멤버는 설정할 상태 비트를 지정하고 state 멤버는 해당 비트에 대한 새 값을 포함합니다.

항목의 오버레이 이미지를 설정하려면 statemaskTVIS_OVERLAYMASK 값이 포함되어야 하고 stateINDEXTOOVERLAYMASK 매크로를 사용하여 왼쪽으로 8비트 이동한 오버레이 이미지의 1부터 시작하는 인덱스를 포함해야 합니다. 오버레이 이미지를 지정하지 않으려면 인덱스가 0일 수 있습니다.

애플리케이션 정의 상태를 나타내기 위해 항목 아이콘 옆에 상태 이미지가 표시됩니다. 상태 이미지는 TVM_SETIMAGELIST 메시지를 전송하여 지정된 상태 이미지 목록에 포함되어 있습니다. 항목의 상태 이미지를 설정하려면 TVITEM 구조체의 statemask 멤버에 TVIS_STATEIMAGEMASK 값을 포함합니다. 구조체의 state 멤버의 비트 12~15는 그릴 이미지의 상태 이미지 목록에 있는 인덱스를 지정합니다.

상태 이미지 인덱스를 설정하려면 INDEXTOSTATEIMAGEMASK를 사용합니다. 이 매크로는 인덱스를 사용하고 비트 12에서 15까지를 적절하게 설정합니다. 항목에 상태 이미지가 없음을 나타내려면 인덱스를 0으로 설정합니다. 이 규칙은 상태 이미지 목록의 이미지 0을 상태 이미지로 사용할 수 없음을 의미합니다. state 멤버의 비트 12~15를 분리하려면 TVIS_STATEIMAGEMASK 마스크를 사용합니다. 오버레이 및 상태 이미지에 대한 자세한 내용은 트리 뷰 이미지 목록을 참조하세요.

항목 선택

트리 뷰 컨트롤은 TVN_SELCHANGINGTVN_SELCHANGED 알림 메시지를 전송하여 선택 항목이 한 항목에서 다른 항목으로 변경될 때 부모 창에 알립니다. 두 알림 모두 변경 내용이 마우스 클릭 또는 키 입력의 결과인지 지정하는 값을 포함합니다. 알림에는 선택 항목을 얻는 항목과 선택 항목을 잃는 항목에 대한 정보도 포함됩니다. 이 정보를 사용하여 항목의 선택 상태에 따라 달라지는 항목 특성을 설정할 수 있습니다. TVN_SELCHANGING에 대한 응답으로 TRUE를 반환하면 선택 항목이 변경되지 않고 FALSE를 반환하면 변경이 허용됩니다.

애플리케이션은 TVM_SELECTITEM 메시지를 전송하여 선택을 변경할 수 있습니다.

항목 정보

트리 뷰 컨트롤은 컨트롤의 항목에 대한 정보를 검색하는 여러 메시지를 지원합니다.

TVM_GETITEM 메시지는 항목의 핸들과 특성을 검색할 수 있습니다. 항목의 특성에는 현재 상태, 항목의 선택 및 선택되지 않은 비트맵 이미지의 컨트롤 이미지 목록에 있는 인덱스, 항목에 자식 항목이 있는지 여부를 나타내는 플래그, 항목 레이블 문자열의 주소 및 항목의 애플리케이션 정의 32비트 값이 포함됩니다.

TVM_GETNEXTITEM 메시지는 현재 항목과 지정된 관계가 있는 트리 뷰 항목을 검색합니다. 메시지는 항목의 부모, 다음 또는 이전 표시 항목, 첫 번째 자식 항목 등을 검색할 수 있습니다.

TVM_GETIMRECT 메시지는 트리 뷰 항목의 경계 사각형을 검색합니다. TVM_GETCOUNTTVM_GETVISIBLECOUNT 메시지는 트리 뷰 컨트롤의 항목 수와 각각 트리 뷰 컨트롤의 창에서 완전히 볼 수 있습니다. TVM_ENSUREVISIBLE 메시지를 사용하여 특정 항목이 표시되도록 할 수 있습니다.

트리 뷰 이미지 목록

트리 뷰 컨트롤의 각 항목에는 연결된 4개의 비트맵 이미지가 있을 수 있습니다.

  • 항목을 선택하면 표시되는 열린 폴더와 같은 이미지.
  • 항목을 선택하지 않으면 표시되는 닫힌 폴더와 같은 이미지.
  • 선택하거나 선택하지 않은 이미지 위에 투명하게 그려지는 오버레이 이미지.
  • 선택되거나 선택되지 않은 이미지의 왼쪽에 표시되는 추가 이미지인 상태 이미지. 선택 및 선택 해제된 확인란과 같은 상태 이미지를 사용하여 애플리케이션 정의 항목 상태를 나타낼 수 있습니다.

기본적으로 트리 뷰 컨트롤은 항목 이미지를 표시하지 않습니다. 항목 이미지를 표시하려면 이미지 목록을 만들고 컨트롤과 연결해야 합니다. 이미지 목록에 대한 자세한 내용은 이미지 목록을 참조하세요.

트리 뷰 컨트롤에는 일반 이미지 목록과 상태 이미지 목록의 두 가지 이미지 목록이 있을 수 있습니다. 일반 이미지 목록은 선택된 이미지, 선택되지 않은 이미지 및 오버레이 이미지를 저장합니다. 상태 이미지 목록은 상태 이미지를 저장합니다. ImageList_Create 함수를 사용하여 이미지 목록을 만들고 다른 이미지 목록 함수를 사용하여 이미지 목록에 비트맵을 추가합니다. 그런 다음 이미지 목록을 트리 뷰 컨트롤과 연결하려면 TVM_SETIMAGELIST 메시지를 사용합니다. TVM_GETIMAGELIST 메시지는 트리 뷰 컨트롤의 이미지 목록 중 하나에 대한 핸들을 검색합니다. 이 메시지는 목록에 더 많은 이미지를 추가해야 하는 경우에 유용합니다.

선택된 이미지와 선택되지 않은 이미지 외에도 트리 뷰 컨트롤의 일반 이미지 목록에는 최대 4개의 오버레이 이미지가 포함될 수 있습니다. 오버레이 이미지는 1부터 시작하는 인덱스로 식별되며 선택 및 선택되지 않은 이미지 위에 투명하게 그려지도록 설계되었습니다. 일반 이미지 목록의 이미지에 오버레이 마스크 인덱스를 할당하려면 ImageList_SetOverlayImage 함수를 호출합니다.

기본적으로 모든 항목은 선택된 상태와 선택되지 않은 상태 모두에 대해 일반 이미지 목록의 첫 번째 이미지를 표시합니다. 또한 기본적으로 항목은 오버레이 이미지나 상태 이미지를 표시하지 않습니다. TVM_INSERTITEM 또는 TVM_SETITEM 메시지를 전송하여 항목에 대한 이러한 기본 동작을 변경할 수 있습니다. 이러한 메시지는 TVITEM 구조체를 사용하여 항목의 이미지 목록 인덱스를 지정합니다.

항목의 선택된 이미지와 선택되지 않은 이미지를 지정하려면 TVITEM 구조체의 mask 멤버에서 TVIF_SELECTEDIMAGE 및 TVIF_IMAGE 비트를 설정하고 iSelectImageiImage 멤버에 있는 컨트롤의 일반 이미지 목록에서 인덱스를 지정합니다. 또는 인덱스를 지정하는 대신 iSelectImageiImage에서 I_IMAGECALLBACK 값을 지정할 수 있습니다. 이렇게 하면 컨트롤이 항목을 다시 그리려고 할 때마다 이미지 목록 인덱스에 대한 부모 창을 쿼리하게 됩니다. 컨트롤은 인덱스를 검색하기 위해 TVN_GETDISPINFO 알림 메시지를 보냅니다.

오버레이 이미지를 항목과 연결하려면 INDEXTOOVERLAYMASK 매크로를 사용하여 항목 TVITEM 구조체의 state 멤버에 오버레이 마스크 인덱스를 지정합니다. 또한 stateMask 멤버에서 TVIS_OVERLAYMASK 비트를 설정해야 합니다. 오버레이 마스크 인덱스는 1부터 시작합니다. 인덱스 0은 오버레이 이미지가 지정되지 않았음을 나타냅니다.

상태 이미지는 별도의 상태 이미지 목록에 저장되며 해당 인덱스로 식별됩니다. 상태 이미지 목록을 지정하려면 TVM_SETIMAGELIST 메시지를 보냅니다. 1부터 시작하는 인덱스를 사용하여 상태 이미지를 식별하는 목록 뷰 컨트롤과 달리 트리 뷰 컨트롤 상태 이미지는 인덱스(0부터 시작)로 식별됩니다. 그러나 인덱스 0은 항목에 상태 이미지가 없음을 나타냅니다. 결과적으로 이미지 0은 상태 이미지로 사용할 수 없습니다. 항목 상태 및 상태 이미지에 대한 자세한 내용은 트리 뷰 항목 상태 개요를 참조하세요.

끌어서 놓기 작업

트리 뷰 컨트롤은 사용자가 항목을 끌기 시작할 때 부모 창에 알립니다. 부모 창은 사용자가 마우스 왼쪽 단추로 항목을 끌기 시작하면 TVN_BEGINDRAG 알림 메시지를 받고, 사용자가 오른쪽 단추로 끌기 시작하면 TVN_BEGINRDRAG 알림 메시지를 받습니다. 트리 뷰 컨트롤에 TVS_DISABLEDRAGDROP 스타일을 지정하여 트리 뷰 컨트롤이 이러한 알림을 보내지 않도록 할 수 있습니다.

TVM_CREATEDRAGIMAGE 메시지를 사용하여 끌기 작업 중에 표시할 이미지를 가져옵니다. 트리 뷰 컨트롤은 끌어오는 항목의 레이블을 기반으로 끌기 비트맵을 만듭니다. 그런 다음 트리 뷰 컨트롤은 이미지 목록을 만들고 비트맵을 추가한 다음 이미지 목록에 대한 핸들을 반환합니다.

항목을 실제로 끄는 코드를 제공해야 합니다. 이 코드에는 일반적으로 이미지 목록 함수의 끌기 기능을 사용하고 끌기 작업이 시작된 후 부모 창으로 전송되는 WM_MOUSEMOVEWM_LBUTTONUP(또는 WM_RBUTTONUP) 메시지를 처리하는 작업이 포함됩니다.

트리 뷰 컨트롤의 항목이 끌어서 놓기 작업의 대상이 되는 경우 마우스 포인터가 대상 항목에 있을 때를 알아야 합니다. TVM_HITTEST 메시지를 사용하여 확인할 수 있습니다. 마우스 포인터의 현재 좌표를 포함하는 TVHITTESTINFO 구조체의 주소를 지정합니다. SendMessage 함수가 반환되면 트리 뷰 컨트롤에 상대적인 마우스 포인터의 위치를 나타내는 플래그가 구조체에 포함됩니다. 포인터가 트리 뷰 컨트롤의 항목 위에 있는 경우 구조체에는 항목에 대한 핸들도 포함됩니다.

상태를 TVIS_DROPHILITED 값으로 설정하도록 TVM_SETITEM 메시지를 사용하여 항목이 끌어서 놓기 작업 대상임을 나타낼 수 있습니다. 이 상태의 항목은 끌어서 놓기 대상을 나타내는 데 사용되는 스타일로 그려집니다.

트리 뷰 컨트롤 알림 메시지

트리 뷰 컨트롤은 다음 알림 메시지를 WM_NOTIFY 메시지 형식으로 부모 창에 보냅니다.

알림 설명
TVN_BEGINDRAG 끌어서 놓기 작업의 시작을 알립니다.
TVN_BEGINLABELEDIT   현재 위치 레이블 편집의 시작을 알립니다.
TVN_BEGINRDRAG 마우스 오른쪽 단추가 끌어서 놓기 작업을 시작했음을 알립니다.
TVN_DELETEITEM 특정 항목의 삭제를 알립니다.
TVN_ENDLABELEDIT 레이블 편집의 끝을 알립니다.
TVN_GETDISPINFO 트리 뷰 컨트롤이 항목을 표시하는 데 필요한 정보를 요청합니다.
TVN_ITEMEXPANDED 부모 항목의 자식 항목 목록이 확장 또는 축소되었음을 나타냅니다.
TVN_ITEMEXPANDING 부모 항목의 자식 항목 목록이 곧 확장되거나 축소될 것임을 알립니다.
TVN_KEYDOWN 키보드 이벤트를 알립니다.
TVN_SELCHANGED 선택 항목이 한 항목에서 다른 항목으로 변경되었음을 알립니다.
TVN_SELCHANGING 선택 항목이 한 항목에서 다른 항목으로 변경되려고 한다는 신호입니다.
TVN_SETDISPINFO 항목에 대해 유지 관리하는 정보를 업데이트해야 함을 부모 창에 알립니다.

 

기본 트리 뷰 컨트롤 메시지 처리

이 섹션에서는 트리 뷰 컨트롤에서 수행하는 창 메시지 처리에 대해 설명합니다. 트리 뷰 컨트롤과 관련된 메시지는 이 문서의 다른 섹션에서 설명하므로 여기에 포함되지 않습니다.

메시지 수행된 처리
WM_COMMAND EN_UPDATEEN_KILLFOCUS 편집 컨트롤 알림 메시지를 처리하고 다른 모든 편집 컨트롤 알림을 부모 창으로 전달합니다. 반환 값이 없습니다.
WM_CREATE 메모리를 할당하고 내부 데이터 구조체를 초기화합니다. 성공하면 0을 반환하고 그렇지 않으면 -1을 반환합니다.
WM_DESTROY 컨트롤과 관련된 모든 시스템 리소스를 해제합니다. 0을 반환합니다.
WM_ENABLE 컨트롤을 사용하거나 사용하지 않도록 설정합니다.
WM_ERASEBKGND 트리 뷰 컨트롤의 현재 배경색을 사용하여 창 배경을 지웁니다. TRUE를 반환합니다.
WM_GETDLGCODE DLGC_WANTARROWS 및 DLGC_WANTCHARS 값의 조합을 반환합니다.
WM_GETFONT 핸들을 현재 레이블 글꼴로 되돌립니다.
WM_HSCROLL 트리 뷰 컨트롤을 스크롤합니다. 스크롤이 발생하면 TRUE를 반환하고 그렇지 않으면 FALSE를 반환합니다.
WM_KEYDOWN 모든 키에 대해 부모 창에 TVN_KEYDOWN 알림 메시지를 보냅니다. 사용자가 ENTER 키를 누르면 NM_RETURN(트리 뷰) 알림 메시지를 보냅니다. 사용자가 방향 키 또는 PAGE UP, PAGE DOWN, HOME, END 또는 BACKSPACE 키를 누르면 캐럿이 이동합니다. 사용자가 이러한 키와 함께 CTRL 키를 누르면 트리 뷰 컨트롤이 스크롤됩니다. 키가 처리되면 TRUE를 반환하고 그렇지 않으면 FALSE를 반환합니다.
WM_KILLFOCUS 초점이 맞춰진 항목이 있으면 다시 그리고 NM_KILLFOCUS(트리 뷰) 알림 메시지를 부모 창에 보냅니다.
WM_LBUTTONDBLCLK 레이블 편집을 취소하고 항목을 두 번 클릭한 경우 NM_DBLCLK(트리 뷰) 알림 메시지를 부모 창에 보냅니다. 부모 창이 0을 반환하면 트리 뷰 컨트롤은 항목의 확장 상태를 토글하여 부모 창에 TVN_ITEMEXPANDINGTVN_ITEMEXPANDED 알림 메시지를 보냅니다. 반환 값이 없습니다.
WM_LBUTTONDOWN 사용자가 부모 항목과 연결된 단추를 클릭한 경우 확장 상태를 토글합니다. 사용자가 항목 레이블을 클릭하면 트리 뷰 컨트롤이 항목을 선택하고 포커스를 설정합니다. 사용자가 마우스 단추를 놓기 전에 마우스를 움직이면 트리 뷰 컨트롤이 끌어서 놓기 작업을 시작합니다. 반환 값이 없습니다.
WM_PAINT 트리 뷰 컨트롤의 잘못된 영역을 그립니다. 0을 반환합니다. wParam 매개 변수가 NULL이 아닌 경우 값이 HDC(디바이스 컨텍스트에 대한 핸들)라고 가정하고 해당 디바이스 컨텍스트를 사용하여 그립니다.
WM_RBUTTONDOWN 항목을 클릭하고 끌기 작업이 시작되었는지 확인합니다. 작업이 시작된 경우 부모 창에 TVN_BEGINRDRAG 알림 메시지를 보내고 놓기 대상을 강조 표시합니다. 그렇지 않으면 부모 창에 NM_RCLICK(트리 뷰) 알림 메시지를 보냅니다. 반환 값이 없습니다.
WM_SETFOCUS 초점이 맞춰진 항목이 있으면 다시 그리고 NM_SETFOCUS 알림 메시지를 부모 창에 보냅니다.
WM_SETFONT 지정된 글꼴 핸들을 저장하고 새 글꼴을 사용하여 트리 뷰 컨트롤을 다시 그립니다.
WM_SETREDRAW 다시 그리기 플래그를 설정하거나 지웁니다. 트리 뷰 컨트롤은 다시 그리기 플래그가 설정된 후에 다시 그려집니다. 0을 반환합니다.
WM_SIZE 트리 뷰 컨트롤의 클라이언트 영역 크기에 따라 달라지는 내부 변수를 다시 계산합니다. TRUE를 반환합니다.
WM_STYLECHANGED 레이블 편집을 취소하고 새 스타일을 사용하여 트리 뷰 컨트롤을 다시 그립니다. 0을 반환합니다.
WM_SYSCOLORCHANGE 다시 그리기 플래그가 설정된 경우 새 색을 사용하여 트리 뷰 컨트롤을 다시 그립니다. 반환 값이 없습니다.
WM_TIMER 항목 레이블 편집을 시작합니다. 포커스가 있는 항목의 레이블을 사용자가 클릭하면 트리 뷰 컨트롤은 즉시 편집 모드로 들어가는 대신 타이머를 설정합니다. 타이머를 사용하면 사용자가 레이블을 두 번 클릭하는 경우 트리 뷰가 편집 모드로 들어가는 것을 방지할 수 있습니다. 0을 반환합니다.
WM_VSCROLL 트리 뷰 컨트롤을 스크롤합니다. 스크롤이 발생하면 TRUE를 반환하고 그렇지 않으면 FALSE를 반환합니다.

 

샘플: CustDTv는 TreeView에서 사용자 지정 그리기를 보여 줍니다(Q248496).