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.7LVCF_IMAGE iImage 변수가 유효한지 (V.4.7)LVCF_ORDER iOrder 변수가 유효한지 (V.4.7)//Version 6.00 and Windows VistaLVCF_MINWIDTH cxMin을 유효하게LVCF_DEFAULTWIDTH csDefault를 유효하게LVCF_IDEALWIDTH csldeal을 유효하게fmfLVCFMT_CENTER,LVCFMT_LEFTLVCFMT_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;
maskLVIF_TEXT pszText 멤버를 사용하겠다.※ iITem과 iSubItem에 대한건 따로 마스크가 없다. 당연히 사용해야 되는 것이라는 뜻인듯
CListCtrl의 주요 Method
InsertItem(...)
행을 추가하는데 그 행의 첫 번째 데이터만 넣는다.
SetItem(...);
0번 열을 제외한 나머지 열에 대한 값들을 넣는다.
SetItemText(행 번호, 열 번호, Item텍스트);
수정
GetItemText(행 번호, 열 번호);
GetItemCount(...);
SetExtendedStyle(...);
DeleteItem()
아이템 삭제
DeleteAllItem()
모든 아이템 삭제
블로그의 정보
정윤상이다.
담배맛구마