mfc_ListCtrl - 8BitsCoding/RobotMentor GitHub Wiki


이미지

위 그림과 같은 리스트 컨트롤을 만드려고 한다.


1. 속성 설정

이미지


2. 리스트 컨트롤의 헤더 컨트롤 추가

// OnInitDialog

LV_COLUMN add_column;

add_column.mask = LVCF_TEXT | LVCF_WIDTH;		// LV_COLUMN 구조체에서 어떠한 정보만 쓰겠다고 명시

add_column.pszText = L"이름";
add_column.cx = 80;				// 폭
m_data_list.InsertColumn(0, &add_column);

add_column.pszText = L"전화번호";
add_column.cx = 100;				// 폭
m_data_list.InsertColumn(1, &add_column);

add_column.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;		// 정렬기능을 추가해보자.
add_column.fmt = LVCFMT_CENTER;
add_column.pszText = L"주소";
add_column.cx = 200;				// 폭
m_data_list.InsertColumn(2, &add_column);

m_data_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);			// 전체 ROW를 선택할 수 있도록 옵션변경

3. 리스트 컨트롤의 아이템 추가

void CTHListCtrlDlg::OnBnClickedAddBtn()
{
	// 3. 리스트 컨트롤에 아이템 추가
	CString str;
	GetDlgItemText(IDC_NAME_EDIT, str);

	int index = m_data_list.GetItemCount();
	LV_ITEM add_item;
	add_item.iItem = index;			// 0번째 아이템

	add_item.mask = LVIF_TEXT;		// Text 항목만 쓰겠다.
	add_item.pszText = (wchar_t *)(const wchar_t *)str;
	add_item.iSubItem = 0;		// 0번째 Column

	m_data_list.InsertItem(&add_item);


	GetDlgItemText(IDC_PHONE_EDIT, str);
	add_item.pszText = (wchar_t *)(const wchar_t *)str;
	add_item.iSubItem = 1;		// 1번째 Column

	m_data_list.SetItem(&add_item);

	GetDlgItemText(IDC_ADD_EDIT, str);
	//add_item.pszText = (wchar_t *)(const wchar_t *)str;
	//add_item.iSubItem = 2;		// 1번째 Column
	m_data_list.SetItemText(index, 2, str);		// 이런 방식도 가능
}

4. 리스트 컨트롤 움직일때 처리

void CTHListCtrlDlg::OnLvnItemchangedDataList(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);

	// 4. 리스트 컨트롤을 움직일때
	if (pNMLV->uNewState & LVIS_SELECTED)
	{
		// 새로운 항목을 선택
		SetDlgItemText(IDC_NAME_EDIT, m_data_list.GetItemText(pNMLV->iItem, 0));
		SetDlgItemText(IDC_PHONE_EDIT, m_data_list.GetItemText(pNMLV->iItem, 1));
		SetDlgItemText(IDC_ADD_EDIT, m_data_list.GetItemText(pNMLV->iItem, 2));
	}

	*pResult = 0;
}

5. 선택된 리스트 컨트롤 데이터 변경

void CTHListCtrlDlg::OnBnClickedModifyBtn()
{
	// 5. 선택된 리스트 컨트롤 데이터 변경
	POSITION pos = m_data_list.GetFirstSelectedItemPosition();
	if (pos == NULL)	// 어떠한 항목도 선택안함
	{

	}
	else {
		int index;
		while (pos != NULL) {
			index = m_data_list.GetNextSelectedItem(pos);
		}

		CString str;
		GetDlgItemText(IDC_NAME_EDIT, str);
		m_data_list.SetItemText(index, 0, str);

		GetDlgItemText(IDC_PHONE_EDIT, str);
		m_data_list.SetItemText(index, 1, str);

		GetDlgItemText(IDC_ADD_EDIT, str);
		m_data_list.SetItemText(index, 2, str);
	}
}