본문 바로가기

업무 채널

[MFC] 리스트컨트롤(List Control) 사용 Tip

리스트컨트롤과 관련된 몇가지 예제들을 올려봅니다.

필요한 부분만 참고해서 사용하세요. 

 

 

1. 리스트컨트롤 추가.


2. 리스트컨트롤 멤버변수 추가
m_list


3. 체크박스 레이아웃 설정
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES );


4. 초기화
m_list.DeleteAllItems();


5. 칼럼명 설정
m_list.InsertColumn(0, _T("번호"), LVCFMT_LEFT, 100, -1);
m_list.InsertColumn(1, _T("제목"), LVCFMT_LEFT, 100, -1);
m_list.InsertColumn(2, _T("작성자"), LVCFMT_LEFT, 100, -1);
m_list.InsertColumn(3, _T("코멘트"), LVCFMT_LEFT, 100, -1);
m_list.InsertColumn(4, _T("파일"), LVCFMT_LEFT, 100, -1);
//칼럼 추가 인덱스, 칼람명, 정렬방향, 칼럼길이, 서브아이템 갯수


6. 데이터 추가
int seq = 0;
CString seq_string;
seq_string.Format(_T("%d"),seq);
CString title=_T("test");
CString writer=_T("박필한");
CString comment=_T("없음");
CString file=_T("파일경로");

m_list.InsertItem(seq,seq_string);
m_list.SetItem(seq,1,LVIF_TEXT,title,0,0,0,NULL);
m_list.SetItem(seq,2,LVIF_TEXT,writer,0,0,0,NULL);
m_list.SetItem(seq,3,LVIF_TEXT,comment,0,0,0,NULL);
m_list.SetItem(seq,4,LVIF_TEXT,file,0,0,0,NULL);

seq = 1;
seq_string.Format(_T("%d"),seq);
title=_T("test2");
writer=_T("박필한2");
comment=_T("있음");
file=_T("파일경로");

m_list.InsertItem(seq,seq_string);
m_list.SetItem(seq,1,LVIF_TEXT,title,0,0,0,NULL);
m_list.SetItem(seq,2,LVIF_TEXT,writer,0,0,0,NULL);
m_list.SetItem(seq,3,LVIF_TEXT,comment,0,0,0,NULL);
m_list.SetItem(seq,4,LVIF_TEXT,file,0,0,0,NULL);


7. 아이템 선택(1개 이상 선택 및 확인)
POSITION pos = m_list.GetFirstSelectedItemPosition();

if (pos == NULL)
AfxMessageBox(_T("No items were selected!\n"));
else
{
while (pos)
{
int nItem = m_list.GetNextSelectedItem(pos);
CString temp = m_list.GetItemText(nItem,0);
temp.Format(_T("%s seq가 선택됨"),temp);
AfxMessageBox(temp);


8. 체크박스 전체 체크
int nCount=m_list.GetItemCount();
for(int i = 0; i< nCount;i++)
m_list.SetCheck(i);


9. 체크박스 전체 해제
//헤더파일에
#ifdef ListView_SetCheckState
#define ListView_SetCheckState(hwndLV,i,fCheck) \
ListView_SetItemState(hwndLV,i, \
INDEXTOSTATEIMAGEMASK((fCheck)+1),LVIS_STATEIMAGEMASK)
#endif

//소스파일에
CListCtrl* tmp;
tmp=&m_list;
int nCount=m_list.GetItemCount();
for(int i = 0; i< nCount;i++)
ListView_SetCheckState(tmp->GetSafeHwnd(),i,FALSE);


10. 체크 확인(1개 이상)
int nCount=m_list.GetItemCount();
for(int i =0 ; i<ncount i="i">
{
BOOL a = m_list.GetCheck(i);
if(a==TRUE)
{
CString temp = m_list.GetItemText(i,0);
temp.Format(_T("%s seq가 선택됨"),temp);
AfxMessageBox(temp);
}
}


11. 데이터 삽입
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
int seq = 0;
CString seq_string;
seq_string.Format(_T("%d"),seq);
CString title=_T("test");
CString writer=_T("이대한");
CString comment=_T("없음");
CString file=_T("파일경로");

m_list.InsertItem(seq,seq_string);
m_list.SetItem(seq,1,LVIF_TEXT,title,0,0,0,NULL);
m_list.SetItem(seq,2,LVIF_TEXT,writer,0,0,0,NULL);
m_list.SetItem(seq,3,LVIF_TEXT,comment,0,0,0,NULL);
m_list.SetItem(seq,4,LVIF_TEXT,file,0,0,0,NULL);


12. 데이터 삭제
POSITION pos = m_list.GetFirstSelectedItemPosition();

if (pos == NULL)
AfxMessageBox(_T("No items were selected!\n"));
else
{
while (pos)
{
int nItem = m_list.GetNextSelectedItem(pos);
CString temp = m_list.GetItemText(nItem,0);
temp.Format(_T("%s seq가 삭제됨"),temp);
AfxMessageBox(temp);
m_list.DeleteItem(nItem);
// you could do your own processing on nItem here
}
} </ncount>