49
7컨트롤과 리소스 I 7.1 리스트 컨트롤 실습 7-1 대화상자에 리스트 컨트롤 만들기 7.2 트리 컨트롤 실습 7-2 대화상자에 트리 컨트롤 만들기

7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

제7장 컨트롤과 리소스 I

7.1 리스트 컨트롤

실습 7-1 대화상자에 리스트 컨트롤 만들기

7.2 트리 컨트롤

실습 7-2 대화상자에 트리 컨트롤 만들기

Page 2: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

리스트 컨트롤 (List Control)

트리 컨트롤 (Tree Control)

탭 컨트롤 (Tab Control)

슬라이드 컨트롤 (Slider Control)

스핀 컨트롤 (Spin Control)

프로그레스바 컨트롤 (Progress Bar Control)

IP 주소 컨트롤 (IP Address Control)

날짜/시간 컨트롤 (Date Time Picker)

애니메이트 컨트롤 (Animate Control)

컨트롤 및 리소스

Page 3: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

리스트 컨트롤

• 프로그램내의 정보를 특정 기준에 따라 분류할 수 있는 컨트롤

리스트 컨트롤의 일반적인 제어

• 칼럼의 추가와 삭제

• 아이템의 추가와 삭제

• 아이템 설정

• 아이템 정렬

• 스타일의 변경

리스트 컨트롤

Page 4: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

4가지 형태로 자료를 출력

• REPORT : 컬럼 제목이 상단에 있고, 아이템들이 컬럼 위치에 설정 되어 있는 상태

• ICON : 큰 아이콘과 첫번째 컬럼의 문자열이 설정된 상태

• SMALLICON : 작은 아이콘과 첫번째 컬럼의 문자열이 설정된 상태

• LIST : 리스트 상자와 같은 형태로 설정

리스트 컨트롤

Page 5: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

윈도우 탐색기가 대표적인 예이다.

리스트 컨트롤

자세히 보기 (REPORT) 큰 아이콘 보기 (ICON)

작은 아이콘 보기 (SMALLICON) 간단히 보기 (LIST)

Page 6: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

LVCOLUMN • 칼럼을 설정하거나 생성하기 위해 사용하는 구조체

• LV_COLUMN으로 사용할 수도 있다

typedef struct _LVCOLUMN { UINT mask; int fmt; int cx; LPTSTR pszText; int cchTextMax; int iSubItem; int iOrder; int iImage; } LVCOLUMN, FAR *LPLVCOLUMN;

리스트 컨트롤

Page 7: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

LVCOLUMN 구조체의 멤버 변수 • mask : 각 멤버가 유효한 정보를 가지고 있는지를 명시하는 변수

• LVCF_FMT : fmt 변수가 유효한지

• LVCF_SUBITEM : iSubItem 변수가 유효한지

• LVCF_TEXT : pszText 변수가 유효한지

• LVCF_WIDTH : cx 변수가 유효한지

• LVCF_IMAGE : iImage 변수가 유효한지 (V.4.7)

• LVCF_ORDER : iOrder 변수가 유효한지 (V.4.7)

리스트 컨트롤

Page 8: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

LVCOLUMN 구조체의 멤버 변수

• fmt : 컬럼 헤딩과 컬럼 안의 부 아이템의 정렬

• LVCFMT_CENTER, LVCFMT_LEFT, LVCFMT_RIGHT

• LVCFMT_BITMAP_ON_RIGHT, LVCFMT_IMAGE

• cx : 컬럼의 너비 (단위 : Pixel)

• pszText : 컬럼에 세팅되는 텍스트

• iSubItem : 컬럼에 연관되는 부 아이템의 색인

리스트 컨트롤

Page 9: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

LVITEM • List view에서 속성을 얻거나 명시하는 구조체

• LV_ITEM으로도 사용될 수 있다 typedef struct _LVITEM {

UINT mask;

int iItem;

int iSubItem;

UINT state;

UINT stateMask;

LPTSTR pszText;

int cchTextMax;

int iImage;

LPARAM lParam;

} LVITEM, FAR *LPLVITEM

리스트 컨트롤

Page 10: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

LVITEM의 멤버 변수 • mask : 각 멤버가 유효한 정보를 가지고 있는지를 명시하는 변수

• iItem : 구조체를 참조하는 아이템의 제로 베이스 색인(삽입 위치)

• iSubItem : 구조체를 참조하는 부 아이템의 원 베이스 색인 또는 구조체를 참조하는 아이템의 제로 베이스 색인

• pszText : 아이템 텍스트를 명시하는 스트링의 주소

리스트 컨트롤

Page 11: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

• 이번 실습은 대화상자에 List Control을 만들고 데이터의 추가, 수정, 그리고 삭제를 할 수 있는 버튼을 만든다.

• List Control의 스타일을 변경할 수 있는 프로그램을 작성하

• List Control에 표현할 데이터는 학과, 학번, 이름

•대화상자에 데이터의 추가, 수정, 삭제 버튼을 생성

• List Control의 스타일의 변경을 위해 콤보 상자를 사용

실습 7-1대화상자에 리스트 컨트롤 만들기

Page 12: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

• 대화상자와 기본 컨트롤의 활용

• List Control의 생성과 데이터 추가/수정/삭제 기법

• 콤보 상자를 통한 컨트롤 스타일의 변경

• 그 밖의 MFC 프로그래밍 기법

실습 7-1

Page 13: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

1)대화상자 기반의 프로젝트를 생성한다.

2)대화상자에 컨트롤을 배치하고, 속성을 설정한다.

• 리스트 컨트롤, 버튼, 콤보 박스, 에디트 박스 등

3)각 컨트롤을 클래스의 멤버변수와 연결한다.

• 클래스 마법사 사용( 멤버 변수Tab)

4)각 컨트롤들을 초기화한다.

• OnInitialDialog()함수에서 초기화 작업을 한다.

실습 7-1프로그램 작성 순서

Page 14: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

5)리스트 컨트롤에 데이터를 추가한다.

• 학과, 학번, 이름을 나타내는 Edit Control의 내용을 읽어온다

• 데이터를 리스트 컨트롤에 업데이트한다.

• 각 데이터가 입력되지 않았으면 에러 처리한다.

6)리스트 컨트롤의 데이터를 수정한다.

• List Control에서 선택된 아이템을 찾는다.

• 선택된 아이템의 데이터를 각각 학과, 학번, 이름을 나타내는 Edit Control에 출력한다.

• 사용자가 키보드를 통해 각 데이터를 수정한다. 그리고 [수정] 버튼을 누른다.

• Edit Control에서 수정된 데이터로 List Control의 해당 아이템을 업데이트한다.

실습 7-1 프로그램 작성 순서

Page 15: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

7) 리스트 컨트롤의 데이터를 삭제한다.

• List Control에서 선택된 아이템을 찾는다.

• List Control에서 아이템을 삭제한다.

8) [다시 쓰기] 버튼을 구현한다.

• 입력한 데이터를 모두 초기화한다.

9) 리스트 컨트롤의 스타일을 변경한다.

• 콤보 박스 선택이 변경 될 때의 메시지 핸들러 함수를 만든다.

10)프로그램을 실행시킨다.

실습 7-1 프로그램 작성 순서

Page 16: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

실행 화면

실습 7-1

Page 17: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

• InsertColumn( )함수

• List Control에 새로운 열을 삽입하는 함수

• SetExtendedStyle( ) 함수

• List Control의 스타일을 확장시키는 함수

• InsertItem( )함수

• List Control에 아이템을 추가 할 때 사용되는 함수

• SetItem( ) 함수

• List Control 아이템의 속성을 설정 할 때 사용하는 함수

CListCtrl 클래스의 주요 멤버 함수

Page 18: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

• GetItemText( )함수

• List Control 아이템이나 서브 아이템의 텍스트를 회수하는 함수

• DeleteItem( ) 함수

• List Control로부터 아이템을 삭제할 때 사용하는 함수

• SetItemText( )함수

• List Control 아이템이나 서브 아이템의 텍스트를 변경하는 함수

CListCtrl 클래스의 주요 멤버 함수

Page 19: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

• 계층 구조를 가진 데이터나 항목을 표현하는 컨트롤

• 트리 컨트롤의 각 항목을 노드라 하며 이 노드는 레이블과 비트맵 이미지로 구성된다.

• 각 노드 앞에 + 기호가 있으면 하위 노드가 존재한다

• 노드가 확장되면 + 기호는 – 기호로 변경된다.

트리 컨트롤

Page 20: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

트리 컨트롤의 예

트리 컨트롤

Page 21: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

TV_INSERTSTRUCT 구조체

• 트리 뷰 컨트롤에 새로운 아이템을 추가하기 위해 사용되는 정보를 포함하는 구조체

typedef struct tagTVINSERTSTRUCT {

HTREEITEM hParent; //상위 항목의 핸들

HTREEITEM hInsertAfter; //삽입 노드의 위치

TVITEM item; //삽입될 노드의 정보

} TVINSERTSTRUCT, FAR *LPTVINSERTSTRUCT;

트리 컨트롤

Page 22: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

실습 7-2대화상자에서 Tree Control를 사용하기

• 대화상자에서 Tree Control을 만들고, 입력한 텍스트를 트리의 노드에 추가하고, 노드를 추가/수정/삭제 해 볼 것이다.

Page 23: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

1) 대화상자 기반의 프로젝트를 생성한다.

2)대화상자에 컨트롤을 배치하고 속성을 설정한다.

• 트리 컨트롤, 버튼, 에디트 박스 등

3)각 컨트롤에 멤버 변수를 연결한다.

4)트리 컨트롤의 처리에 필요한 변수를 추가한다.

• 루트 변수와 선택된 노드를 나타내는 변수

실습 7-2프로그램 작성 순서

Page 24: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

5)각 컨트롤들을 초기화한다.

• OnInitDialog() 함수에서 초기화 작업을 한다.

6)트리 컨트롤에 아이템을 추가한다.

7)트리 컨트롤의 아이템 이름을 수정한다.

8)트리 컨트롤에 있는 아이템을 삭제한다.

9)프로그램을 실행시킨다.

실습 7-2프로그램 작성 순서

Page 25: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

• GetItemText( )함수

• Tree Control 아이템의 텍스트를 반환하는 함수

• SetItemText( ) 함수

• Tree Control 아이템의 텍스트를 변경하는 함수

• InsertItem( )함수

• Tree Control에 아이템을 추가 할 때 사용되는 함수

• Expand( ) 함수

• Tree Control 자식 노드의 리스트를 확장할 때 사용하는 함수

• DeleteItem( ) 함수

• Tree Control로부터 아이템을 삭제할 때 사용하는 함수

CTreeCtrl 클래스의 주요 멤버 함수

Page 26: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

실행결과

실습 7-2

Page 27: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

연습 문제 7-1 • 학생 정보를 처리하는 프로젝트

Page 28: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

m_bID = TRUE; TV_INSERTSTRUCT tvStruct; tvStruct.hParent = 0; tvStruct.hInsertAfter = TVI_LAST; tvStruct.item.mask = TVIF_TEXT; tvStruct.item.pszText = _T("가상대학교"); m_hRoot = m_treeDept.InsertItem(&tvStruct); tvStruct.hParent = m_hRoot; tvStruct.hInsertAfter = TVI_LAST; tvStruct.item.mask = TVIF_TEXT; tvStruct.item.pszText = (LPTSTR)(LPCSTR)_T("국어국문학과");

m_hKorean = m_treeDept.InsertItem(&tvStruct);

BOOL CExercise7_1Dlg::OnInitDialog()

Page 29: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

tvStruct.item.pszText = (LPTSTR)(LPCSTR)_T("컴퓨터공학과");

m_hComputer = m_treeDept.InsertItem(&tvStruct); tvStruct.item.pszText = (LPTSTR)(LPCSTR)_T("물리학과");

m_hPhysics = m_treeDept.InsertItem(&tvStruct); m_treeDept.Expand(m_hRoot, TVE_EXPAND); m_nCount=0; LV_COLUMN lvColumn; LPWSTR list[5] = {_T("학번"), _T("이름"), _T("학년"),

_T("성별"), _T("주소")}; int nWidth[5] = {54, 54, 54, 53, 150};

BOOL CExercise7_1Dlg::OnInitDialog()

Page 30: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

for(int i=0; i<5; i++) { lvColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; lvColumn.fmt = LVCFMT_LEFT; lvColumn.pszText = list[i]; lvColumn.iSubItem = i; lvColumn.cx = nWidth[i]; m_listStudent.InsertColumn(i, &lvColumn); } m_listStudent.SetExtendedStyle(m_listStudent.GetExtendedStyle() |

LVS_EX_FULLROWSELECT); ((CButton*) GetDlgItem(IDC_BUTTON_INSERT))->EnableWindow(FALSE); ((CButton*) GetDlgItem(IDC_BUTTON_MODIFY))->EnableWindow(FALSE); ((CButton*) GetDlgItem(IDC_BUTTON_DELETE))->EnableWindow(FALSE); return TRUE; // TRUE }

BOOL CExercise7_1Dlg::OnInitDialog()

Page 31: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

((CButton*) GetDlgItem(IDC_BUTTON_MODIFY))->EnableWindow(FALSE); ((CButton*) GetDlgItem(IDC_BUTTON_DELETE))->EnableWindow(FALSE);

m_hSelectedNode = pNMTreeView->itemNew.hItem;

if(m_hSelectedNode == m_hKorean) {

m_studentInfo[m_nCount].strDept.Format(_T("국어국문학과")); ((CButton*) GetDlgItem(IDC_BUTTON_INSERT))->EnableWindow(TRUE); }

else if(m_hSelectedNode == m_hComputer) {

m_studentInfo[m_nCount].strDept.Format(_T("컴퓨터공학과")); ((CButton*) GetDlgItem(IDC_BUTTON_INSERT))->EnableWindow(TRUE); }

else if(m_hSelectedNode == m_hPhysics) {

m_studentInfo[m_nCount].strDept.Format(_T("물리학과")); ((CButton*) GetDlgItem(IDC_BUTTON_INSERT))->EnableWindow(TRUE); }

void CExercise7_1Dlg::OnSelchangedTreeDept(NMHDR *pNMHDR, LRESULT *pResult)

Page 32: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

else { m_studentInfo[m_nCount].strDept.Format(_T("가상 대학교")); ((CButton*) GetDlgItem(IDC_BUTTON_INSERT))->EnableWindow(FALSE); ((CButton*) GetDlgItem(IDC_BUTTON_MODIFY))->EnableWindow(FALSE); ((CButton*) GetDlgItem(IDC_BUTTON_DELETE))->EnableWindow(FALSE); }

LV_ITEM lvItem; CString strGrade, strSex; m_listStudent.DeleteAllItems();

for(int i=0; i<m_nCount; i++) { int nCount = m_listStudent.GetItemCount();

void CExercise7_1Dlg::OnSelchangedTreeDept(NMHDR *pNMHDR, LRESULT *pResult)

Page 33: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

if(m_treeDept.GetItemText(m_hSelectedNode) == m_studentInfo[i].strDept || m_hSelectedNode==m_hRoot) { if(m_studentInfo[i].nGrade == 0) {

strGrade.Format(_T("1학년")); } else if(m_studentInfo[i].nGrade == 1) {

strGrade.Format(_T("2학년")); } else if(m_studentInfo[i].nGrade == 2) { strGrade.Format(_T("3학년")); } else if(m_studentInfo[i].nGrade == 3) { strGrade.Format(_T("4학년")); }

if(m_studentInfo[i].nSex == 0) { strSex.Format(_T("남자")); } else if(m_studentInfo[i].nSex == 1) { strSex.Format(_T("여자")); }

void CExercise7_1Dlg::OnSelchangedTreeDept(NMHDR *pNMHDR, LRESULT *pResult)

Page 34: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

lvItem.mask = LVIF_TEXT; lvItem.iItem = nCount; lvItem.iSubItem = 0; lvItem.pszText = (LPWSTR)(LPCWSTR)m_studentInfo[i].strID; m_listStudent.InsertItem(&lvItem);

lvItem.mask = LVIF_TEXT; lvItem.iItem = nCount; lvItem.iSubItem = 1; lvItem.pszText = (LPWSTR)(LPCWSTR)m_studentInfo[i].strName; m_listStudent.SetItem(&lvItem);

lvItem.mask = LVIF_TEXT; lvItem.iItem = nCount; lvItem.iSubItem = 2; lvItem.pszText = (LPWSTR)(LPCWSTR)strGrade; m_listStudent.SetItem(&lvItem);

lvItem.mask = LVIF_TEXT; lvItem.iItem = nCount; lvItem.iSubItem = 3; lvItem.pszText = (LPWSTR)(LPCWSTR)strSex; m_listStudent.SetItem(&lvItem);

void CExercise7_1Dlg::OnSelchangedTreeDept(NMHDR *pNMHDR, LRESULT *pResult)

Page 35: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

lvItem.mask = LVIF_TEXT;

lvItem.iItem = nCount;

lvItem.iSubItem = 4;

lvItem.pszText = (LPWSTR)(LPCWSTR)m_studentInfo[i].strAddress;

m_listStudent.SetItem(&lvItem);

}

}*pResult = 0;

void CExercise7_1Dlg::OnSelchangedTreeDept(NMHDR *pNMHDR, LRESULT *pResult)

Page 36: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

LV_ITEM lvItem; int nCount = m_listStudent.GetItemCount(); CInfoDlg *pInfo = new CInfoDlg; CString strGrade, strSex;

if(pInfo->DoModal() == IDOK) { if(!pInfo->m_strID.IsEmpty() && !pInfo->m_strName.IsEmpty() && !(pInfo->m_nGrade < 0)

&& !(pInfo->m_nSex < 0) && !pInfo->m_strAddress.IsEmpty()) { for(int i = 0; i < m_nCount; i++) { if(m_studentInfo[i].strID == pInfo->m_strID) { m_bID = FALSE; break; } else { m_bID = TRUE; } }

void CExercise7_1Dlg::OnClickedButtonInsert()

Page 37: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

if(m_bID) { m_studentInfo[m_nCount].strDept = m_treeDept.GetItemText(m_hSelectedNode); m_studentInfo[m_nCount].strID = pInfo->m_strID; m_studentInfo[m_nCount].strName = pInfo->m_strName; m_studentInfo[m_nCount].nGrade = pInfo->m_nGrade; m_studentInfo[m_nCount].nSex = pInfo->m_nSex; m_studentInfo[m_nCount].strAddress = pInfo->m_strAddress;

if(m_studentInfo[m_nCount].nGrade == 0) { strGrade.Format(_T("1학년")); } else if(m_studentInfo[m_nCount].nGrade == 1) { strGrade.Format(_T("2학년")); } else if(m_studentInfo[m_nCount].nGrade == 2) { strGrade.Format(_T("3학년")); } else if(m_studentInfo[m_nCount].nGrade == 3) { strGrade.Format(_T("4학년")); }

void CExercise7_1Dlg::OnClickedButtonInsert()

Page 38: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

if(m_studentInfo[m_nCount].nSex == 0) { strSex.Format(_T("남자")); } else if(m_studentInfo[m_nCount].nSex == 1) { strSex.Format(_T("여자")); }

if(m_treeDept.GetItemText(m_hSelectedNode) == m_studentInfo[m_nCount].strDept) { lvItem.mask = LVIF_TEXT; lvItem.iItem = nCount; lvItem.iSubItem = 0; lvItem.pszText = (LPWSTR)(LPCWSTR)m_studentInfo[m_nCount].strID; m_listStudent.InsertItem(&lvItem);

lvItem.mask = LVIF_TEXT; lvItem.iItem = nCount; lvItem.iSubItem = 1; lvItem.pszText = (LPWSTR)(LPCWSTR)m_studentInfo[m_nCount].strName; m_listStudent.SetItem(&lvItem);

lvItem.mask = LVIF_TEXT; lvItem.iItem = nCount; lvItem.iSubItem = 2; lvItem.pszText = (LPWSTR)(LPCWSTR)strGrade; m_listStudent.SetItem(&lvItem);

void CExercise7_1Dlg::OnClickedButtonInsert()

Page 39: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

lvItem.mask = LVIF_TEXT; lvItem.iItem = nCount; lvItem.iSubItem = 3; lvItem.pszText = (LPWSTR)(LPCWSTR)strSex; m_listStudent.SetItem(&lvItem);

lvItem.mask = LVIF_TEXT; lvItem.iItem = nCount; lvItem.iSubItem = 4; lvItem.pszText = (LPWSTR)(LPCWSTR)m_studentInfo[m_nCount].strAddress; m_listStudent.SetItem(&lvItem); }

m_nCount++; } else {

MessageBox(_T("이미 존재하는 학번입니다.") , _T("잠깐"), MB_OK); } } else { MessageBox(_T("모든 항목을 입력해 주세요.") , _T("잠깐"), MB_OK); } }

((CButton*) GetDlgItem(IDC_BUTTON_INSERT))->EnableWindow(FALSE); }

void CExercise7_1Dlg::OnClickedButtonInsert()

Page 40: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

LV_ITEM lvItem; CString strGrade, strSex; CInfoDlg *pInfo = new CInfoDlg; int Num;

for(int j = 0; j<m_nCount; j++) { if(m_listStudent.GetItemText(m_nSelectedItem, 0) == m_studentInfo[j].strID) { pInfo->m_strID = m_studentInfo[j].strID; pInfo->m_strName = m_studentInfo[j].strName; pInfo->m_nGrade = m_studentInfo[j].nGrade; pInfo->m_nSex = m_studentInfo[j].nSex; pInfo->m_strAddress = m_studentInfo[j].strAddress; Num = j; } }

if(pInfo->DoModal() == IDOK) { for(int i = 0; i < m_nCount; i++) { if(m_studentInfo[i].strID == pInfo->m_strID && i != Num) { m_bID = FALSE; break; }

void CExercise7_1Dlg::OnClickedButtonModify()

Page 41: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

else { m_bID = TRUE; } }

if(m_bID) { m_studentInfo[Num].strID = pInfo->m_strID; m_studentInfo[Num].strName = pInfo->m_strName; m_studentInfo[Num].nGrade = pInfo->m_nGrade; m_studentInfo[Num].nSex = pInfo->m_nSex; m_studentInfo[Num].strAddress = pInfo->m_strAddress;

m_listStudent.DeleteAllItems();

for(int i=0; i<m_nCount; i++) { int nCount = m_listStudent.GetItemCount();

if(m_studentInfo[i].nGrade == 0) {

strGrade.Format(_T("1학년")); } else if(m_studentInfo[i].nGrade == 1) {

strGrade.Format(_T("2학년")); } else if(m_studentInfo[i].nGrade == 2) {

strGrade.Format(_T("3학년")); } else if(m_studentInfo[i].nGrade == 3) {

void CExercise7_1Dlg::OnClickedButtonModify()

Page 42: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

strGrade.Format(_T("4학년")); }

if(m_studentInfo[i].nSex == 0) { strSex.Format(_T("남자")); } else if(m_studentInfo[i].nSex == 1) { strSex.Format(_T("여자")); }

if(m_treeDept.GetItemText(m_hSelectedNode) == m_studentInfo[i].strDept) { lvItem.mask = LVIF_TEXT; lvItem.iItem = nCount; lvItem.iSubItem = 0; lvItem.pszText = (LPWSTR)(LPCWSTR)m_studentInfo[i].strID; m_listStudent.InsertItem(&lvItem);

lvItem.mask = LVIF_TEXT; lvItem.iItem = nCount; lvItem.iSubItem = 1; lvItem.pszText = (LPWSTR)(LPCWSTR)m_studentInfo[i].strName; m_listStudent.SetItem(&lvItem);

void CExercise7_1Dlg::OnClickedButtonModify()

Page 43: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

lvItem.mask = LVIF_TEXT; lvItem.iItem = nCount; lvItem.iSubItem = 2; lvItem.pszText = (LPWSTR)(LPCWSTR)strGrade; m_listStudent.SetItem(&lvItem);

lvItem.mask = LVIF_TEXT; lvItem.iItem = nCount; lvItem.iSubItem = 3; lvItem.pszText = (LPWSTR)(LPCWSTR)strSex; m_listStudent.SetItem(&lvItem);

lvItem.mask = LVIF_TEXT; lvItem.iItem = nCount; lvItem.iSubItem = 4; lvItem.pszText = (LPWSTR)(LPCWSTR)m_studentInfo[i].strAddress; m_listStudent.SetItem(&lvItem); } } } else {

MessageBox(_T("이미 존재하는 학번입니다.") , _T("잠깐"), MB_OK); } } else {

MessageBox(_T("모든 항목을 입력해주세요"),_T("잠깐"),MB_OK); } ((CButton*) GetDlgItem(IDC_BUTTON_MODIFY))->EnableWindow(FALSE); ((CButton*) GetDlgItem(IDC_BUTTON_DELETE))->EnableWindow(FALSE);}

void CExercise7_1Dlg::OnClickedButtonModify()

Page 44: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

int Num; LV_ITEM lvItem; CString strGrade, strSex;

if(MessageBox(_T("정말로 삭제하시겠습니까?"), _T("삭제 경고"), MB_YESNO) == IDYES) { for(int j=0; j<m_nCount; j++) { if(m_listStudent.GetItemText(m_nSelectedItem, 0) == m_studentInfo[j].strID) { Num=j; } }

for(int k=Num; k<m_nCount; k++) { m_studentInfo[k] = m_studentInfo[k+1]; }

m_nCount--;

m_listStudent.DeleteAllItems();

for(int i=0; i<m_nCount; i++) { int nCount = m_listStudent.GetItemCount(); if(m_treeDept.GetItemText(m_hSelectedNode) == m_studentInfo[i].strDept)

void CExercise7_1Dlg::OnClickedButtonDelete()

Page 45: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

{ if(m_studentInfo[i].nGrade == 0) {

strGrade.Format(_T("1학년")); } else if(m_studentInfo[i].nGrade == 1) {

strGrade.Format(_T("2학년")); } else if(m_studentInfo[i].nGrade == 2) {

strGrade.Format(_T("3학년")); } else if(m_studentInfo[i].nGrade == 3) {

strGrade.Format(_T("4학년")); }

if(m_studentInfo[i].nSex == 0) {

strSex.Format(_T("남자")); } else if(m_studentInfo[i].nSex == 1) {

strSex.Format(_T("여자")); }

lvItem.mask = LVIF_TEXT; lvItem.iItem = nCount; lvItem.iSubItem = 0;

void CExercise7_1Dlg::OnClickedButtonDelete()

Page 46: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

lvItem.pszText = (LPWSTR)(LPCWSTR)m_studentInfo[i].strID; m_listStudent.InsertItem(&lvItem);

lvItem.mask = LVIF_TEXT; lvItem.iItem = nCount; lvItem.iSubItem = 1; lvItem.pszText = (LPWSTR)(LPCWSTR)m_studentInfo[i].strName; m_listStudent.SetItem(&lvItem);

lvItem.mask = LVIF_TEXT; lvItem.iItem = nCount; lvItem.iSubItem = 2; lvItem.pszText = (LPWSTR)(LPCWSTR)strGrade; m_listStudent.SetItem(&lvItem);

lvItem.mask = LVIF_TEXT; lvItem.iItem = nCount; lvItem.iSubItem = 3; lvItem.pszText = (LPWSTR)(LPCWSTR)strSex; m_listStudent.SetItem(&lvItem);

lvItem.mask = LVIF_TEXT; lvItem.iItem = nCount; lvItem.iSubItem = 4; lvItem.pszText = (LPWSTR)(LPCWSTR)m_studentInfo[i].strAddress; m_listStudent.SetItem(&lvItem); } } ((CButton*) GetDlgItem(IDC_BUTTON_MODIFY))->EnableWindow(FALSE); ((CButton*) GetDlgItem(IDC_BUTTON_DELETE))->EnableWindow(FALSE); }}

void CExercise7_1Dlg::OnClickedButtonDelete()

Page 47: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. m_nSelectedItem = pNMLV->iItem;

((CButton*) GetDlgItem(IDC_BUTTON_INSERT))->EnableWindow(FALSE);

if(m_hSelectedNode == m_hKorean) { m_studentInfo[m_nCount].strDept.Format(_T("국어국문학과")); ((CButton*) GetDlgItem(IDC_BUTTON_MODIFY))->EnableWindow(TRUE); ((CButton*) GetDlgItem(IDC_BUTTON_DELETE))->EnableWindow(TRUE); }

else if(m_hSelectedNode == m_hComputer) { m_studentInfo[m_nCount].strDept.Format(_T("컴퓨터공학과")); ((CButton*) GetDlgItem(IDC_BUTTON_MODIFY))->EnableWindow(TRUE); ((CButton*) GetDlgItem(IDC_BUTTON_DELETE))->EnableWindow(TRUE); }

void CExercise7_1Dlg::OnItemchangedListStudent(NMHDR *pNMHDR, LRESULT *pResult)

Page 48: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

else if(m_hSelectedNode == m_hPhysics) { m_studentInfo[m_nCount].strDept.Format(_T("물리학과")); ((CButton*) GetDlgItem(IDC_BUTTON_MODIFY))->EnableWindow(TRUE); ((CButton*) GetDlgItem(IDC_BUTTON_DELETE))->EnableWindow(TRUE); }

else { m_studentInfo[m_nCount].strDept.Format(_T("가상 대학교")); ((CButton*) GetDlgItem(IDC_BUTTON_MODIFY))->EnableWindow(FALSE); ((CButton*) GetDlgItem(IDC_BUTTON_DELETE))->EnableWindow(FALSE); }*pResult = 0; }

void CExercise7_1Dlg::OnItemchangedListStudent(NMHDR *pNMHDR, LRESULT *pResult)

Page 49: 7장 컨트롤과 리소스 Icontents.kocw.net/KOCW/document/2015/shinhan/parkweejoon/... · 2016-09-09 · 제7장 컨트롤과 리소스 i 7.1 리스트 컨트롤 ... •대화상자와

연습 문제 7-1

실행결과