보통 자료량이 좀 많은 데이터나, 혹은 하나의 자료가 여러 속성을 가지고 있을 경우 이러한
자료를 효율적으로 보여지는데 리스트 컨트롤이 많이 사용된다.

윈도우 탐색기를 예로 들어보면 수월하게 이해할 수 있을 것이다.

그냥 갯수나 살필 필요가 있을 경우는 그냥 상태바를 보지만..
무슨 파일들이 있나 살펴볼 때는 스몰아이콘이나, 리스트 형식으로 보게되고..
데이터의 세세한 정보를 살펴볼 때는 레포트 타입으로 자료를 접하게 된다...


이렇게 아이콘과 디스플레이용 이름 그리고, 필요한 추가 정보를 하나의 화면에서 다양한 형태로
사용자에게 제공해 줌으로써 사용자가 쉽게 정보를 분류하고 선택할 수 있도록 제공된다.

일단 비주얼 스튜디오의 리소스 편집창에 리스트 컨트롤을 하나 올려보자.

기본적으로 컨트롤을 올려놓으면 커다라 아이콘 모양이 나오고, 색깔이 들어있는 모양을 보여준다.
여러가지 속성페이지가 보이는데, 관심을 가질 페이지는 StylesMore Styles 이다.

속성페이지 - Style
--------------------------------------------------------------------------------------

1. View
    - 사용자가 컨트롤을 바라보는 시각을 나타낸다.
       Small Icon과 List 타입은 구분이 좀 모호해서, 이해를 돕기 위해 이미지를 삽입하였다.

    Icon : 큰 아이콘 모양으로 화면에 보인다. 기본 32*32이다.

    Small Icon : 작은 아이콘타입으로 화면에 자유분방하게 보여줄 수 있다?  
                      정해진 크기를 가지는 Icon 타입을 제외하고, 화면에 가장 많은 정보를 보여준다.
                      특별히 아이콘을 정리해주거나 하지 않으면 중구난방, 지저분해 보인다.
                      요즘은 거의 사용되지 않는다.         

    List : 디스플레이 이름의 길이만큼 아이템 넓이를 확보하여 우로 스크롤 하면서 보여준다.
            아이템의 디스플레이 문자열이 길 경우 한 화면에 보여지는 데이터량이 줄어들 수 있다.


    Report : 아이콘과 디스플레이 이름 및 지정된 세부정보를 레포트 형식으로 볼 수 있다.

2. Align
   - 데이터를 넣어야할 공간이 존재할 때 추가된 데이터를 화면 상단(Top)부터 채워 나가던가,
     아니면 좌측(Left)부터 우측으로 채워나간다던가.. 그러한 걸 결정한다.
     Icon과 Small Icon 뷰 스타일에서만 적용된다.

3. Sort 
  - 데이터가 추가되면 디스플레이 이름을 기준으로 아이템을 정렬할 것인지를 설정할 수 있다.
     리스트 박스와는 다르게 InsertItem 밖에는 없기 때문에, 추가와 삽입에 따른 차이는 없다.
     ListReport 뷰 스타일에서만 적용되며, 그냥 냅두기(None), 내림차순(Descending),
     오름차순(Ascending)을 지원한다.

4. Single selection
  - 아이템을 선택할 경우 단 하나만 선택할 수 있도록 제어한다. 디폴트는 다중 선택이다.

5. Auto arrange
  - IconSmall Icon 뷰 스타일에만 적용되는 것으로써, 아이템을 추가하거나 삭제할 경우
    자동으로 공간을 계산해서 재 배치해준다. 디폴트는 지우면 지우는 대로 빵구난 형태가 된다.

6. No label wrap
 - Icon 뷰 스타일일 경우에만 적용되고, 이 옵션이 첵크되면 디스플레이 이름(앞으로 레이블)이
   길 경우 한줄로 죽 늘여뜨려준다. 디폴트는 문자열을 축약해 보여주는 형태이며 포커스를 가질
   경우 전체 문자열을 아이템의 너비로 아래로 죽 늘여서 보여준다.


7. Edit labels

  - 레이블을 인플레스 모드의 에디트 컨트롤을 이용하여 직접 수정할 수 있다. 이럴 경우 부모
    윈도우는 LVN_ENDLABELEDIT 메시지를 적절히 처리해 주어야한다.

8. No scroll
  - 이름 그대로 아이템이 화면을 넘칠만큼 많아도 스크롤바를 생성시켜 주지 않는다.
   
9. No column header
  - Report 뷰 스타일에서만 적용되며, 레포트의 컬럼 양식을 나타내는 헤더 컨트롤을 숨겨
     보여지거나 여타 다른 동작을 막아준다.

10 . No sort header
  - Report 뷰 스타일에서만 적용되며, 헤더 컨트롤을 클릭할수 없도록 한다. 보통은 컬럼 헤더의
    클릭 이벤트를 처리해 아이템을 소트해주거나 하는 작업을 하는데 사용된다.

11. Show selection always
  - 아이템을 선택하여 놓았을 경우 선택 마크가 남게되는데, 해당 컨트롤이나 부모 위도우가
    포커스를 잃었을 경우 선택마크가 사라져 보이고, 다시 포커스가 오면 돌아온다. 이 옵션을
    켜 놓으면 포커스를 읽더라도 옅은 회색으로 항상 선택되어졌던 아이템을 볼 수 있다.


속성페이지 - More Styles
--------------------------------------------------------------------------------------


1. Owner draw fixed
  - 아이템의 드로우를 내부적으로 직접 처리할 수 있도록 해준다.

2. Share image list
  - 리스트 컨트롤을 파괴할 때 이미지 리스트를 지우지 않는다. 여러개의 리스트 컨트롤을 띄워
    놓고 하나의 이미지 리스트를 이용하여 아이콘을 보여줄 경우 유용하다

3. Border
  - 바닥으로 약간 가라 앉게 보이는 모양을 만들어 준다. -_-

4. Owner data
  - 가상 리스트 컨트롤이라고도 불리우는데, 리스트 컨트롤 내부에서 제공해주는 자료 구조가
    아닌 사용자가 직접 작성한 자료구조를 이용하여 데이터를 처리할 수 있다.

    리스트 컨트롤의 레이블은 256바이트를 넘을 수 없다거나, 데이터를 삽입하는 속도가 엄청
    느리거나 하는 등의 문제를 해결할 때 사용한다.
    보통 삽입 속도 개션을 목적으로 주로 사용된다.


다음 장에서는 기본적인 용법에 대하여 다루어 보겠습니다.
리스트 컨트롤은 그 기능만큼이나 많은 메서드를 제공해 주기 때문에 알것도 배울것도 많죠.
여하튼 복잡한 컨트롤임에는 틀림없습니다. ^^;







+ Recent posts