2010년 10월 22일 금요일

[리스트컨트롤-기초04] struct LVITEM

리스트 컨트롤을 다룰 경우 미리 알아두면 좋은 정보가 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;


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 이상일 경우는 아이템이
    여러개의 이미지를 가진것으로 표기한다.


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

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

 

다음은 주요 메서드에 대한 설명을 진행해 보도록 하겠습니다.

 

PS. 영문을 직역하기도 그렇고 이해하고 있는데로 써내리기도 그렇고, 글로써 쓴다는 것이 쉽지 않네요..

말로 하면 몇마디면 끝날것을.. 글 쓴다는게 쉬운일이 아닌것 같습니다.. -_-;;;

댓글 없음:

댓글 쓰기