리스트 컨트롤을 다룰 경우 미리 알아두면 좋은 정보가 LVITEM 이라는 구조체에 대한 것이다.
컨트롤에 데이터를 그냥 넣고/빼고 할경우는 몰라도 되지만...

프로그래밍 적으로 이미지를 바꾼다던가,
선택한다던가..
포커스를 준다던가..
하이라이팅을 한다던가..
이미 있는 문자열을 바꾸고, 파라미터를 변경하고..

이러한 모든 작업을 아래의 구조체 하나로 해결할 수 있는 것이다.

주의) 아래의 구조체는 Visual Studio 98의 Service Pack 6를 적용한 형태이다.
서비스펙 버전에 따라 구조체가 다르며, 플랫폼 SDK 마다 다를 수 있다.

typedef struct tagLVITEMA
{
    UINT mask;              마스크용 플래그
    int iItem;                  아이템 인덱스
    int iSubItem;             서브 아이템 인덱스
    UINT state;              상태값
    UINT stateMask;      상태값 마스크용 플래그
    LPSTR pszText;       디스플레이용 텍스트
    int cchTextMax;       텍스트의 길이 
    int iImage;               이미지의 인덱스 
    LPARAM lParam;      저장할 파라미터
#if (_WIN32_IE >= 0x0300)
    int iIndent;
#endif
} LVITEMA, FAR* LPLVITEMA; or UNICODE LVITEMW, FAR* LPLVITEMW;
typedef struct tagLVITEMA
{
    UINT mask;              마스크용 플래그
    int iItem;                  아이템 인덱스
    int iSubItem;             서브 아이템 인덱스
    UINT state;              상태값
    UINT stateMask;      상태값 마스크용 플래그
    LPSTR pszText;       디스플레이용 텍스트
    int cchTextMax;       텍스트의 길이 
    int iImage;               이미지의 인덱스 
    LPARAM lParam;      저장할 파라미터

#if (_WIN32_IE >= 0x0300) // common control v4.7
    int iIndent;
#endif

#if (_WIN32_WINNT >= 0x501) // common control v 6.0
    int iGroupId;
    UINT cColumns; // tile view columns
    PUINT puColumns;

#endif
} LVITEMA, FAR* LPLVITEMA; or UNICODE LVITEMW, FAR* LPLVITEMW;


mask  이 구조체에 어떠한 값을 적용하려고 하는지 지정하는 플래그.
   LVIF_TEXT    pszText 값에 설정하거나 가져온다.
   LVIF_IMAGE  iImage  값에 설정하거나 가져온다.
   LVIF_IDENT   iDndent 값에 설정하거나 가져온다.
   LVIF_PARAM lParam 값에 설정하거나 가져온다.
   LVIF_STATE  state 값에 설정하거나 가져온다.
   LVIF_NORECOMPUTE
          컨트롤이 LVN_GETDISPINFO 메시지를 생성하지 못하게 한다. LVN_GETDISPINFO
          메시지는 나중에 다루겠지만 텍스트를 가공할 수 있도록 제공되는 이벤트이다.
          대신에 pszText에 LPSTR_TEXTCALLBACK 를 넣어야한다.

iItem 아이템의 인덱스를 나타낸다.
        어떤 아이템에 값을 적용하거나 가져오기 위하여 필수적으로 채워넣어야한다.

iSubItem 아이템의 서브 인덱스(컬럼 순서대로 0부터 n)를 나타낸다.
        LVIF_TEXT 플래그가 있을 경우는 필수적으로 설정하여야한다.

state 현 아이템에 상태값을 설정하거나 가져온다.
stateMask 어떤 상태값을 설정하거나 가져올 지 마스킹한다. 플래그는 다음과 같다.
   LVIS_FOCUSED                포커스를 준다.
   LVIS_SELECTED               선택한 표시를 한다.
   LVIS_CUT                          희뿌옇게 탐색기에서 잘라낸것 처럼 만든다.
   LVIS_DROPHILITED           드래그&드롭시 타켓을 하이라이트 시킨다.
   LVIS_OVERLAYMASK        오버레이 이미지 인덱스 8-11 bit (4bit)
   LVIS_STATEIMAGEMASK  스테이트 이미지 마스크 인덱스 12-15 bit (4bit)
        마지막 두개의 마스크는 state의 주어진 비트를 비트마스킹하여 값을 설정하거나 가져온다.

pszText 주어진 아이템의 문자열
   문자열을 설정할 때는 문자열의 포인터를 주면 되지만, 가져올 경우는 가져올 버퍼 포인터를
   설정하고 cchTextMax에 버퍼크기를 주어야한다.

cchTextMax  문자열 버퍼의 크기

iImage 이미지 리스트의 인덱스
    연결한 이미지 리스트의 번호를 설정하면 아이템에 아이콘이 보인다.

lParam 하나의 아이템에 부가정보가 필요할 경우 LPARAM 값에 설정할 수 있다. 4바이트 이므로
    값이 저보다 작을 경우는 직접 이용하고, 그보다 클 경우는 포인터를 변환하여 넣을 수 있다.

iIndent 아이템이 가진 이미지의 갯수. 하나일 경우는 디폴트 이지만 2 이상일 경우는 아이템이
    여러개의 이미지를 가진것으로 표기한다.


구조체 하나 하나에 대한 샘플을 만들면 이해에 도움이 되겠지만, 당장 필요하지 않으면
샘플이 있느나 마나, 이해에 도움이 되지 않는것 같네요..

개략적으로 이해하시면 될꺼구요, 각각의 쓰임은 강좌가 진행되는 대로 중간 중간에 필요한
내용이 나오면 추가할 것입니다.

#if (_WIN32_WINNT >= 0x501) // common control v 6.0
    int iGroupId;
    UINT cColumns; // tile view columns
    PUINT puColumns;

#endif
위 내용은 common control 6.0 이상에서 지원되고요..
불행히도 Platform SDK를 업그레이드를 하더라도 MFC 6.0에서는 지원을 하지 않습니다.
제 컴이 꼬져서 6.0만 깔아놓은 상태라..

그리고, 그룹에 관련된 기능은 아직 써본적이 없는 상태라.. 공부하려고 해도 툴이 필요한데
VS2005를 깔게 되면 다시 추가하도록 하겠습니다.


+ Recent posts