MFC - List Control (리스트 컨트롤)

2014. 3. 20. 18:50Programing/MFC

List Control

 

List control은 아이콘, 작은 아이콘, 간단히, 보고서의 네 가지 형태로 데이터를 보여주는 컨트롤입니다.이중 보고서 모드가 List control에 설정된 데이터를 가장 자세히 보여주는 모드입니다. 따라서 List control에 데이터를 설정할 때는 이 모드를 기준으로 하면 됩니다. 보고서 모드에는 하나의 아이템에 대해 가로줄로 여러 가지 데이터를 보여줄 수 있는데, 이러한 가루 줄을 각각 컬럼이라고 하고, 컬럼 맨 위에 각 컬럼의 제목을 표시하는 줄을 컬럼 헤더라고 합니다.

 

 

 

|구현하고자 하는 기능|

List control을 포함하는 대화상자를 만들어 보도록 합니다. 

선택항목 삭제, 위로, 아래로 등을 이용해 위치를 바꾸고 삭제하는 프로그램을 만들어 보겠습니다.

 

 

 

|App Wizard|

스켈레톤 코드를 생성한다.

 

프로젝트 생성

다이얼로그 형식의 프로젝트를 생성합니다.

Project type

Project name

MFC AppWizard (exe)

ListControl

Step. 1

Dialog based

 

 

 

|App Setup|

사용자 인터페이스 요소들을 시작적으로 디자인한다.

 

대화상자 리소스 디자인

 [MFC]ListControl 01.png

 

위와 같이 대화상자에 List control을 올려놓고, List control의 속성을 설정합니다. List control의 속성을 아래에 정리 해 놓았습니다.

 

속성 정리

속성

의미

View

Icon, Small Icon, List, Report 중 하나를 선택할 수 있습니다.

Allign

Left, Right 중 하나를 선택할 수 있으며, 아이콘 정렬의 기준을 설정합니다.

Sort

None, Ascending, Descending 중 하나를 선택할 수 있으며, 정렬 방법을 설정합니다.

Single selection

오직 하나의 항목만 선택할 수 있도록 합니다.

Auto arrange

Icon 또는 Small Icon에서 아이콘들을 자동으로 정렬되도록 합니다.

No label wrap

아이콘과 함께 쓰이는 텍스트가 한 줄로 쓰여지도록 합니다.

Edit labels

텍스트를 편집할 수 있게 합니다. 이 스타일을 선택하면 텍스트 편집이 끝나면 LVN_ENDLABELEDIT 이벤트가 발생합니다.

No column header

Report에서 컬럼 헤더를 표시하지 않도록 합니다.

No sort header

컬럼 헤더가 표시되더라도 동작하지 않도록 합니다. 보통 컬럼 헤더는 정렬 모드를 바꾸기 위해 사용됩니다.

 

속성 설정

컨트롤

ID

Caption

기타

List control

IDC_LIST1

 

[View] 속성[Report]

 

 

 

 

Push Button1

IDC_BUTTON_UP

위로

 

 

 

 

 

Push Button2

IDC_BUTTON_DOWN

아래로

 

 

 

 

 

Push Button3

IDC_BUTTON_DELETE

삭제

 

 

 

 

 

Push Button4

IDC_BUTTON_PRINT

출력

 

 

 

 

 

 

탭 순서 설정

순서가 중요한 프로그램이 아니어서 순서 지정 없이 진행합니다.

 

 


|Class Wizard|

AppStudio에서 시각적으로 디자인된 요소들을 실제 프로그램 코드와 연결 시킨다. 새로운 클래스를 정의한다. 각 컨트롤들의 메시지 핸들러를 재 정의한다.

 

컨트롤과 멤버 변수 연결

Class Wizard  Member Variables 에서 연결 시킨다.

Control

Type

Member

List control

Control

CListCtrl m_ctrlList

 

 

 

 

CListCtrl의 주요 멤버 함수

List control에 컬럼 및 아이템을 추가 삭제등 한다.

멤버 함수

기능

InsertItem

새로운 항목을 추가 합니다.

DeleteItem

지정된 항목을 삭제 합니다.

DeleteAllitems

모든 항목들을 삭제 합니다.

GetItemCount

항목의 개수를 얻습니다.

SetItem

GetItem

각각의 아이템의 정보를 설정합니다.

각각의 아이템의 정보를 얻습니다.

SetItemText

GetItemText

각각의 아이템의 텍스트를 설정합니다.

각각의 아이템의 텍스트를 얻습니다.

InsertColumn

새로운 컬럼을 추가 합니다.

DeleteColumn

지정된 컬럼을 삭제 합니다.

SetImageList

GetImageList

각각의 아이콘으로 사용될 이미지 리스트를 설정합니다.

각각의 아이콘으로 사용될 이미지 리스트를 얻습니다.

 

List Control이 발생시키는 이벤트

List control이 발생시키는 주요 이벤트

이벤트

발생 시기

LVN_COLUMNCLICK

컬럼 헤더가 클릭 되었을 때

LVN_DELETEITEM

항목이 삭제 되었을 때

LVN_DELETEALLITEMS

모든 항목이 삭제 되었을 때

LVN_INSERTITEM

새로운 항목이 추가 되었을 때

LVN_ITEMCHANGED

선택된 항목이 다른 항목으로 변경 되었을 때

LVN_KEYDOWN

키보드가 눌렸을 때

 

메시지 핸들러 재 정의

각각의 버튼들의 메시지 핸들러를 재 정의 합니다.

 

void CListControlDlg::OnButtonUp()

{

             // TODO: Add your control notification handler code here

}

 

void CListControlDlg::OnButtonDown()

{

             // TODO: Add your control notification handler code here

}

 

void CListControlDlg::OnButtonDelete()

{

             // TODO: Add your control notification handler code here

}

 

void CListControlDlg::OnButtonPrint()

{

             // TODO: Add your control notification handler code here

}

 

 

|코딩|

 

컨트롤 초기화

//컬럼을 생성합니다.

BOOL CListControlDlg::OnInitDialog()

{

             

 

             CRect rect;

             m_ctrlList.GetClientRect(&rect);

             m_ctrlList.InsertColumn(0, _T("이름"), LVCFMT_LEFT, 100);

             m_ctrlList.InsertColumn(1, _T("나이"), LVCFMT_RIGHT, 100);

             m_ctrlList.InsertColumn(2, _T("성별"), LVCFMT_CENTER, 100);

             m_ctrlList.InsertColumn(3, _T("전화"), LVCFMT_LEFT, rect.Width()-220);

            

             return TRUE;  // return TRUE  unless you set the focus to a control

}

 

아이템 추가

//각 컬럼에 아이템을 추가한다.

BOOL CListControlDlg::OnInitDialog()

{

             

 

             CString str;

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

             {

                           m_ctrlList.InsertItem(i, strName[i], rand()%5);

 

                           str.Format("%d",rand()%100);

                           m_ctrlList.SetItemText(i, 1, str);

 

                           if(rand()%2 == 0) str="남자";

                           else str = "여자";

                           m_ctrlList.SetItemText(i,2,str);

 

                           str.Format("%03d - %04d", rand()%1000, rand()%10000);

                           m_ctrlList.SetItemText(i,3,str);

             }

             return TRUE;  // return TRUE  unless you set the focus to a control

}

 

선택 항목 위로

//아이템을 선택하고 위로 버튼을 눌렀을 때를 처리한다.

void CListControlDlg::OnButtonUp()

{

             // TODO: Add your control notification handler code here

 

             POSITION pos;

             while(pos = m_ctrlList.GetFirstSelectedItemPosition())

             {

                           int nSelItem = m_ctrlList.GetNextSelectedItem(pos);

 

                           CString strTemp;

                           strTemp = m_ctrlList.GetItemText(nSelItem-1, 0);

 

                           if(!strTemp.IsEmpty())

                           {

                                        CString strName, strAge, strSex, strTel;

                                        strName  = m_ctrlList.GetItemText(nSelItem,0);

                                        strAge     = m_ctrlList.GetItemText(nSelItem,1);

                                        strSex     = m_ctrlList.GetItemText(nSelItem,2);

                                        strTel       = m_ctrlList.GetItemText(nSelItem,3);

 

                                        m_ctrlList.DeleteItem(nSelItem);

 

                                        m_ctrlList.InsertItem(nSelItem-1, strName, 0);

                                        m_ctrlList.SetItemText(nSelItem-1, 1, strAge);

                                        m_ctrlList.SetItemText(nSelItem-1, 2, strSex);

                                        m_ctrlList.SetItemText(nSelItem-1, 3, strTel);

                           }

                           else break;

             }

}

 

선택 항목 아래로

//아이템을 선택하고 아래로 버튼을 눌렀을 때를 처리한다.

void CListControlDlg::OnButtonDown()

{

             // TODO: Add your control notification handler code here

            

             POSITION pos;

             while(pos = m_ctrlList.GetFirstSelectedItemPosition())

             {

                           int nSelItem = m_ctrlList.GetNextSelectedItem(pos);

 

                           CString strTemp;

                           strTemp   = m_ctrlList.GetItemText(nSelItem+1, 0);

 

                           if(!strTemp.IsEmpty())

                           {

                                        CString strName, strAge, strSex, strTel;

                                        strName  = m_ctrlList.GetItemText(nSelItem,0);

                                        strAge     = m_ctrlList.GetItemText(nSelItem,1);

                                        strSex     = m_ctrlList.GetItemText(nSelItem,2);

                                        strTel       = m_ctrlList.GetItemText(nSelItem,3);

 

                                        m_ctrlList.DeleteItem(nSelItem);

 

                                        m_ctrlList.InsertItem(nSelItem+1, strName, 0);

                                        m_ctrlList.SetItemText(nSelItem+1, 1, strAge);

                                        m_ctrlList.SetItemText(nSelItem+1, 2, strSex);

                                        m_ctrlList.SetItemText(nSelItem+1, 3, strTel);

                           }

                           else break;

             }

}

 

선택 항목 삭제

//아이템을 선택하고 삭제 버튼을 눌렀을 때를 처리한다.

void CListControlDlg::OnButtonDelete()

{

             // TODO: Add your control notification handler code here

 

             POSITION pos;

             while(pos = m_ctrlList.GetFirstSelectedItemPosition())

             {

                           int nSelItem = m_ctrlList.GetNextSelectedItem(pos);

                           m_ctrlList.DeleteItem(nSelItem);

             }

}

 

항목 삭제

//출력 버튼을 눌렀을 때를 처리한다.

void CListControlDlg::OnButtonPrint()

{

             // TODO: Add your control notification handler code here

 

             int nSelItem = 0;

             CString strPrint, strTemp;

 

             while(1)

             {

                           strTemp   = m_ctrlList.GetItemText(nSelItem,0);

                           if(strTemp.IsEmpty()) break;

                           strTemp += "         ";

                           strTemp   += m_ctrlList.GetItemText(nSelItem,1);

                           strTemp += "         ";

                           strTemp   += m_ctrlList.GetItemText(nSelItem,2);

                           strTemp += "         ";

                           strTemp   += m_ctrlList.GetItemText(nSelItem,3);

 

                           strTemp += "\n";

 

                           strPrint += strTemp;

 

                           nSelItem ++;

             }

             AfxMessageBox(strPrint);

}