2014. 3. 20. 18:50ㆍPrograming/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|
사용자 인터페이스 요소들을 시작적으로 디자인한다.
대화상자 리소스 디자인
위와 같이 대화상자에 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);
}
'Programing > MFC' 카테고리의 다른 글
[Mac OS] MFC 개발 환경 구축 - Mono (0) | 2015.11.17 |
---|---|
MFC - 문자열을 숫자로 변환하기 (HEX to DEC) (0) | 2014.03.20 |
MFC - 리스트 컨트롤 (List control) 라인별 색상 지정 (0) | 2014.03.20 |
MFC - Child Form 최대화 시키기 (0) | 2014.03.04 |
MFC - Dialog(다이얼로그) 색 변경하기 (0) | 2014.03.04 |