.

MFC ListControl

by 담배맛구마

※List Control에 값 넣는 방법

1. Column 설정해야한다.

LVCOLUMN 구조체를 이용해서 값을 설정한 다음 등록하는 방식을 사용한다.

1    mask

LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM

2    fmt

LVCFMT_CENTER

3    cx

배열을 이용해서 입력하면 편해져 int COLWIDTH[ ] = { 100, 100, 200, 150, ..., 300 }

4    pszText

배열을 이용해서 입력하면 편해져 TCHAR* COLNAME[ ] = {_T("호갱번호"), _T("호갱이름"),...}

5   iSubItem

번째 Column이냐? 따지는 건데 int형이고 0부터 카운트 하면

3 4 배열로 사용하므로 for문의 계속 증가하는 변수값으로 잡으면되

처럼 구조체에 값을 다넣었으면 InsertColumn( Column번호(자료형은 int), LVCOLUMN 구조체의 주소)

 

SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);  이거 해주면 격자가 생긴다.

int COLWIDTH[] = {100, 200, 300, 200,....., 300};

TCHAR* COLNAME[] = { _T("고객번호"), .... };

LVCOLUMN col = { LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM,  LVCFMT_CENTER}; // 1 2 동시에 입력

for(int i=0; .... ; i<++)

{

col.cx = COLWIDTH[i];

col.pszText = COLNAME[i];

col.iSubItem = i;


InsertColumn( i, &col);

}


2. Item 삽입한다.

LVITEM 구조체를 이용해서 따로 함수를 생성해서InsertItem(...), SetItem(...) 호출

1     mask

LVIF_TEXT ; iItem iSubItem 따로 설정안해도 필수로 활성화 된다

2    iItem

int형으로 해당 Item 넣을 행의 넘버를 의미한다. 0 부터 세는

3    iSubItem

int형으로 해당 Item 위치할 열의 넘버를 의미한다. 0부터 세는

4    pszText

LPTSTR형인데 CString.GetBuffer() 하면 자동으로 변환해줘

for(int i=0 ; .... ; i++)    // i 하나씩 증가할때마다 행씩 추가된다.

{

CString ROWTEXT[] = {.......};

for(int j=0 ; .... ; j++)    // 이건 행에 대해서 Column마다 넣는 작업

{

AddItem(i, j, ROWTEXT[j]);

}

}


아래 같이 따로 함수를 생성해준다. 행의 번째 Column 넣을 때와 이후에 넣을때 함수가 다르기에 이렇게


void AddItem(int nItem, int nSubItem, CString strItem){

LVITEM row = { LVIF_TEXT };

row.iItem = nItem;

row.iSubItem = nSubItem;

row.pszText = strItem.GetBuffer();


if(nSubItem == 0)    InsertItem(&row)

else                 SetItem(&row)

}


Column Setting하는데 쓰이는 정보를 저장하는 구조체

(http://msdn.microsoft.com/en-us/library/windows/desktop/bb774743(v=vs.85).aspx)

typedef struct _LVCOLUMN {

  UINT        mask;             //다른 Parameter들을 유효하게(vaild) 만들어준다. 즉 어떤 Parameter을 사용하겠다 명시해준다.

  int           fmt;               //문자열 정렬

  int           cx;                //Column의 너비

LPTSTR    pszText;        //Header에 쓰일 문자열

  int           cchTextMax;   //pszText의 버퍼 크기(안써도된다는데?)

  int           iSubItem;           //몇 번째 Column이냐? 0부터 시작한다

//Version 4.7

#if (_WIN32_IE >= 0x0300)   

  int        iImage;

  int        iOrder;

#endif 


//Version 6.00 and Windows Vista

#if (_WIN32_WINNT >= 0x0600)

  int    cxMin;

  int    cxDefault;

  int    cxIdeal;

#endif

} LVCOLUMN, *LPLVCOLUMN;

mask

      LVCF_FMT                      fmt 변수가 유효한지
      LVCF_SUBITEM                iSubItem 변수가 유효한지
      LVCF_TEXT                     pszText 변수가 유효한지
      LVCF_WIDTH                    cx 변수가 유효한지

//Version 4.7
      LVCF_IMAGE                   iImage 변수가 유효한지 (V.4.7)
      LVCF_ORDER                  iOrder 변수가 유효한지 (V.4.7)

//Version 6.00 and Windows Vista
LVCF_MINWIDTH              cxMin을 유효하게
LVCF_DEFAULTWIDTH       csDefault를 유효하게
LVCF_IDEALWIDTH           csldeal을 유효하게


fmf
      LVCFMT_CENTER,
LVCFMT_LEFT
LVCFMT_RIGHT
...etc




Column 너비 자동 조절


CListCtrl::SetColumnWidth(

int nCol;

int cx;            // LVSCW_AUTOSIZE 또는 LVSCW_AUTOSIZE_USEHEADER(이건 Hedaer 문자열에 맞게 사이즈 주기

);





ITEM을 Setting하는데 쓰이는 정보를 저장하는 구조체

(http://msdn.microsoft.com/en-us/library/windows/desktop/bb774760(v=vs.85).aspx)

typedef struct { UINT         mask;         //구조체 멤버中 사용할 멤버 지정 int             iItem;        //행 번호 0부터 시작 int             iSubItem;     //열 번호, 0부터 시작 UINT         state; UINT         stateMask;   LPTSTR     pszText;      //데이터값 int            cchTextMax; int            iImage; LPARAM    lParam; #if (_WIN32_IE >= 0x0300) int    iIndent; #endif #if (_WIN32_WINNT >= 0x0501) int           iGroupId; UINT       cColumns; UINT       puColumns; #endif #if (_WIN32_WINNT >= 0x0600) int    piColFmt; int    iGroup; #endif } LVITEM, *LPLVITEM;


mask
      LVIF_TEXT                      pszText 멤버를 사용하겠다.
※ iITem과 iSubItem에 대한건 따로 마스크가 없다. 당연히 사용해야 되는 것이라는 뜻인듯




CListCtrl의 주요 Method


InsertItem(...)

행을 추가하는데 그 행의 첫 번째 데이터만 넣는다.


SetItem(...);

0번 열을 제외한 나머지 열에 대한 값들을 넣는다.


SetItemText(행 번호, 열 번호, Item텍스트);

수정


GetItemText(행 번호, 열 번호);


GetItemCount(...);


SetExtendedStyle(...);


DeleteItem()

아이템 삭제

DeleteAllItem()

모든 아이템 삭제





반응형

블로그의 정보

정윤상이다.

담배맛구마

활동하기