58
Visual C++ Programming Controls 3 Department of Digital Contents Sang Il Park

Visual C++ Programming Controls 3

  • Upload
    sally

  • View
    92

  • Download
    1

Embed Size (px)

DESCRIPTION

Visual C++ Programming Controls 3. Department of Digital Contents Sang Il Park. Outline. Review Control: Button Controls 3 Static Control Edit Control List Box Control Combo Box Control. Review: Control. 표준화된 형태와 특성을 가진 윈도우 사용자에게 입력을 받거나 정보를 보여줌. Review: 정적 컨트롤. 정적 컨트롤 종류 텍스트 - PowerPoint PPT Presentation

Citation preview

Page 1: Visual C++ Programming  Controls 3

Visual C++ Programming Controls 3

Department of Digital Contents

Sang Il Park

Page 2: Visual C++ Programming  Controls 3

Outline

• Review– Control: Button

• Controls 3– Static Control– Edit Control– List Box Control– Combo Box Control

Page 3: Visual C++ Programming  Controls 3

3

Review: Control

• 표준화된 형태와 특성을 가진 윈도우• 사용자에게 입력을 받거나 정보를 보여줌

Page 4: Visual C++ Programming  Controls 3

4

Review: 정적 컨트롤

• 정적 컨트롤 종류– 텍스트– 프레임 ( 색으로 채워지지 않은 사각형 ),

사각형 ( 색으로 채워진 사각형 ), 아이콘 , 비트맵 ,향상된 메타파일 (Enhanced Metafile)

Page 5: Visual C++ Programming  Controls 3

5

Review: 편집 컨트롤

• 편집 컨트롤

• 편집 컨트롤 종류

Page 6: Visual C++ Programming  Controls 3

Review: 편집 콘트롤을 제어

• 컨트롤 메시지를 주기 위해서는… CEdit 타입의 변수를 추가하고 컨트롤과 연결 직접 연결 (DoDataExchange 함수 이용 ) 또는 컨트롤의 변수 추가 기능을 이용하여 자동으로 추가

Page 7: Visual C++ Programming  Controls 3

7

Review: 편집 컨트롤 제어 함수

• 텍스트를 변경하거나 입력된 텍스트를 알아내기

• 입력 가능한 문자열의 길이를 제한하기

• 각종 편집 작업

m_edit.SetWindowText(" 초기값입니다 .");CString str; m_edit.GetWindowText(str);

m_edit.SetLimitText(10);

m_edit.Clear();m_edit.Cut();m_edit.Copy();m_edit.Paste();m_edit.Undo();

Page 8: Visual C++ Programming  Controls 3

8

Review: 리스트 박스 컨트롤

• 리스트 박스 컨트롤 종류

• 속성 대화상자

단일 선택리스트 박스

다중 선택리스트 박스

Page 9: Visual C++ Programming  Controls 3

9

Review: 리스트 박스 컨트롤 제어 함수

• 항목 추가와 삭제

• 항목 선택

m_list.AddString(" 사과 ");m_list.DeleteString(3);

// 단일 선택 리스트 박스 컨트롤인 경우m_list.SetCurSel(2);

// 다중 선택 리스트 박스 컨트롤인 경우m_list.SetSel(2);m_list.SetSel(3, FALSE);

Page 10: Visual C++ Programming  Controls 3

10

Review: 리스트 박스 컨트롤 제어 함수

• 선택된 항목 알아내기

// 단일 선택 리스트 박스 컨트롤인 경우int nIndex = m_list.GetCurSel();if(nIndex != LB_ERR){ CString str; m_list.GetText(nIndex, str);}

// 다중 선택 리스트 박스 컨트롤인 경우int nIndex = m_list.GetCaretIndex();if(nIndex != LB_ERR){ CString str; m_list.GetText(nIndex, str);}

Page 11: Visual C++ Programming  Controls 3

Announcement:

• 보강공고 :– 5 월 29 일 토요일– 오전 11 시 30 분 ~1 시 00 분– 장소 : 율곡관 304 호 실습실

Page 12: Visual C++ Programming  Controls 3

12

콤보 박스 컨트롤 (1/6)

• 콤보 박스 컨트롤 종류

단순스타일

드랍다운스타일

드랍다운 리스트스타일

편집 컨트롤 정적 컨트롤

리스트박스컨트롤

Page 13: Visual C++ Programming  Controls 3

13

콤보 박스 컨트롤 (2/6)

• 속성 대화상자

Page 14: Visual C++ Programming  Controls 3

14

콤보 박스 컨트롤 (3/6)

• 콤보 박스 컨트롤 스타일

콤보 박스 컨트롤 스타일

CBS_AUTOHSCROLLCBS_DISABLENOSCROLLCBS_DROPDOWNCBS_DROPDOWNLISTCBS_HASSTRINGSCBS_LOWERCASECBS_NOINTEGRALHEIGHT

CBS_OEMCONVERTCBS_OWNERDRAWFIXEDCBS_OWNERDRAWVARIABLE

CBS_SIMPLECBS_SORTCBS_UPPERCASE

의미

= ES_AUTOHSCROLL= LBS_DISABLENOSCROLL드랍다운 스타일드랍다운 리스트 스타일= LBS_HASSTRINGS= ES_LOWERCASE= LBS_NOINTEGRALHEIGHT

= ES_OEMCONVERT= LBS_OWNERDRAWFIXED= LBS_OWNERDRAWVARIABLE

단순 스타일= LBS_SORT= ES_UPPERCASE

속성 대화상자의 항목

Auto HScrollDisable no scrollType: DropdownType: Drop ListHas stringsLowercaseNo integral height

OEM convertOwner draw: FixedOwner draw: Variable

Type: SimpleSortUppercase

Page 15: Visual C++ Programming  Controls 3

15

콤보 박스 컨트롤 (4/6)

• 콤보 박스 컨트롤 통지 메시지

통지 메시지

CBN_CLOSEUP CBN_DBLCLK

CBN_DROPDOWN CBN_EDITCHANGE CBN_EDITUPDATE CBN_ERRSPACE CBN_KILLFOCUSCBN_SELCHANGE CBN_SELENDCANCEL CBN_SELENDOK CBN_SETFOCUS

의미

리스트 박스가 닫혔다 .사용자가 항목을 더블 클릭하였다 .

리스트 박스가 열리기 직전이다 .= EN_EDITCHANGE= EN_EDITUPDATE메모리가 부족하다 .키보드 포커스를 잃었다 .= LBN_SELCHANGE = LBN_SELENDCANCEL 사용자가 항목을 선택하였다 .키보드 포커스를 얻었다 .

스타일

단순 드랍다운

드랍다운 리스트

Page 16: Visual C++ Programming  Controls 3

16

콤보 박스 컨트롤 (5/6)

• 항목 추가와 삭제

• 선택된 항목 알아내기

m_combo.AddString(" 사과 ");m_combo.DeleteString(3);

int nIndex = m_combo.GetCursel();if(nIndex != CB_ERR){ CString str; m_combo.GetLBText(nIndex, str);}

Page 17: Visual C++ Programming  Controls 3

17

콤보 박스 컨트롤 (6/6)

• 입력 가능한 문자열의 길이 제한하기

• 각종 편집 작업

m_combo.LimitText(10);

m_combo.Clear(); m_combo.Cut();m_combo.Copy();m_combo.Paste();

Page 18: Visual C++ Programming  Controls 3

18

스크롤 바 컨트롤 (1/3)

• 스크롤 바 컨트롤– 화면의 일정 영역을 스크롤하거나 정해진 범위의 값을

변경시키는 용도로 사용

• 스크롤 바 코드

Page 19: Visual C++ Programming  Controls 3

19

스크롤 바 컨트롤 (2/3)

• 주요 함수

멤버 함수 역할

SetScrollRange() 스크롤 박스 위치값의 최소값과 최대값을 설정한다 .

SetScrollPos() 스크롤 박스의 현재 위치를 설정한다 .

GetScrollPos() 스크롤 박스의 현재 위치를 얻는다 .

Page 20: Visual C++ Programming  Controls 3

스크롤 바 컨트롤 (3/3)

• 발생 메시지 :

• MessageMap 추가 : 마크로 함수 사용– Scroll Bar 는 ID 에 상관없이 공통된 마크로함수사용

• Event Message Handler 추가

ON_WM_HSCROLL() 또는 ON_WM_VSCROLL()ON_WM_HSCROLL() 또는 ON_WM_VSCROLL()

void OnHScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

void OnVScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

void OnHScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

void OnVScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

WM_HSCROLL/ WM_VSCROLLWM_HSCROLL/ WM_VSCROLL

Page 21: Visual C++ Programming  Controls 3

21

스크롤 바 컨트롤 (4/3)

• WM_HSCROLL/WM_VSCROLL 메시지 핸들러

– nSBCode• 스크롤 바 코드

– nPos• 스크롤 박스의 위치• 스크롤 바 코드가 SB_THUMBPOSITION 또는

SB_THUMBTRACK 인 경우에만 사용

– pScrollBar• 스크롤 바 컨트롤을 가리키는 포인터

void OnHScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

void OnVScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);

Page 22: Visual C++ Programming  Controls 3

코딩연습

• 다음과 같이 편집콘트롤과 , 스크롤바를 붙이고 , 스크롤바를 움직이면 편집콘트롤에 그 값을 표시하는 프로그램을 만들어 보자 . – 스크롤바의 범위 (0~100)

Page 23: Visual C++ Programming  Controls 3

Dialog Box

Page 24: Visual C++ Programming  Controls 3

24

개요 (1/2)

• 대화상자– 다양한 컨트롤을 포함하고 있는 일종의 윈도우– 사용자로부터 입력을 받거나 정보를 출력

Page 25: Visual C++ Programming  Controls 3

25

개요 (2/2)

• 대화상자 종류– 모드형 대화상자 (modal dialog)

• 대화상자를 닫지 않으면 응용 프로그램이 더 이상 진행할 수 없다 .

– 비 모드형 대화상자 (modeless dialog)• 대화상자를 닫지 않더라도 응용 프로그램이 계속 진행할 수 있

다 .

Page 26: Visual C++ Programming  Controls 3

26

대화상자 템플릿 (1/3)

• 대화상자 템플릿– 대화상자 자체와 포함된 컨트롤에 대한 모든 정보를

가지고 있는 이진 데이터– 리소스로 실행 파일에 포함

• 대화상자 템플릿 작성– 비주얼 C++ 리소스 편집기나 텍스트 편집기를

이용하여 리소스 스크립트 (*.RC) 작성– 리소스 컴파일러로 이진 파일 (*.RES) 파일 생성– 링크 과정에서 실행 파일에 포함

Page 27: Visual C++ Programming  Controls 3

27

대화상자 템플릿 (2/3)

• 리소스 스크립트 작성

Page 28: Visual C++ Programming  Controls 3

28

대화상자 템플릿 (3/3)

• 리소스 스크립트 작성 (cont'd)

IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 187, 98STYLE DS_MODALFRAME|WS_POPUP|WS_CAPTION|

WS_SYSMENUCAPTION "Dialog"FONT 10, "System"BEGIN DEFPUSHBUTTON "OK",IDOK,130,7,50,14 PUSHBUTTON "Cancel",IDCANCEL,130,24,50,14 EDITTEXT

IDC_EDIT1,7,7,117,14,ES_AUTOHSCROLL EDITTEXT

IDC_EDIT2,7,24,117,14,ES_AUTOHSCROLLEND

Page 29: Visual C++ Programming  Controls 3

29

대화상자 편집기 (1/4)

• 컨트롤 추가와 삭제– 컨트롤 (Controls) 툴바 이용

Page 30: Visual C++ Programming  Controls 3

30

대화상자 편집기 (2/4)

• 컨트롤 배치– 대화상자 (Dialog) 툴 바 이용

– Format menu 이용

Page 31: Visual C++ Programming  Controls 3

31

대화상자 편집기 (3/4)

• 탭 순서– Tab 키를 눌렀을 때 키보드 포커스가 이동하는 순서– [Format]->[Tab Order] 메뉴를 이용하여 변경

Page 32: Visual C++ Programming  Controls 3

32

대화상자 편집기 (4/4)

• 대화상자 속성

폰트를 바꾸면 대화상자와 대화상자에 포함된 컨트롤의 크기가 폰트의 크기에 비례해서 변경된다 .폰트를 바꾸면 대화상자와 대화상자에 포함된 컨트롤의 크기가 폰트의 크기에 비례해서 변경된다 .

Page 33: Visual C++ Programming  Controls 3

33

모드형 대화상자 (1/4)

• MFC 클래스 계층도

Page 34: Visual C++ Programming  Controls 3

34

모드형 대화상자 (1/4)

• 모드형 대화상자 작성 순서① 대화상자 리소스 작성

Resource View

② CDialog ( 파생 ) 클래스 객체 생성 • 이 때 대화상자 리소스 ID 를 생성자의 인자로 넘겨준다 .

[Project] [add class] menu 이용

③ CDialog::DoModal() 함수 호출

Page 35: Visual C++ Programming  Controls 3

35

모드형 대화상자 (2/4)

• CDialog 클래스 가상 함수

– 호출 시점 : WM_INITDIALOG 메시지 발생시– 용도 : 컨트롤을 초기화하거나 키보드 포커스를 변경

– 호출 시점 : IDOK 버튼을 누를 때– 용도 : 컨트롤의 값을 읽거나 값의 타당성 여부를 검사한

후 대화상자 종료

virtual BOOL CDialog::OnInitDialog ( );

virtual void CDialog::OnOK ( );

Page 36: Visual C++ Programming  Controls 3

36

모드형 대화상자 (3/4)

• CDialog 클래스 가상 함수 (cont'd)

– 호출 시점 : IDCANCEL 버튼을 누를 때– 용도 : 대화상자 종료

virtual void CDialog::OnCancel ( );

Page 37: Visual C++ Programming  Controls 3

37

모드형 대화상자 (4/4)

• OnOK(), OnCancel() 함수 내부 구현

void CDialog::OnOK(){ UpdateData(TRUE); EndDialog(IDOK);}

void CDialog::OnCancel(){ EndDialog(IDCANCEL);}

Page 38: Visual C++ Programming  Controls 3

38

DDX/DDV (1/8)

• 모드형 대화상자 구현

class CMyDialog : public CDialog{ ... CString m_str; int m_color; ...}

Page 39: Visual C++ Programming  Controls 3

39

DDX/DDV (2/8)

• 모드형 대화상자 구현 (cont'd)

BOOL CMyDialog::OnInitDialog() { CDialog::OnInitDialog(); SetDlgItemText(IDC_STR, m_str); SetDlgItemInt(IDC_COLOR, m_color); return TRUE;}

void CMyDialog::OnOK() { GetDlgItemText(IDC_STR, m_str); m_color = GetDlgItemInt(IDC_COLOR); CDialog::OnOK();}

Page 40: Visual C++ Programming  Controls 3

40

DDX/DDV (3/8)

• 동작 원리

IDC_STRIDC_COLOR

①②

대화상자

m_str m_color

대화상자 객체

m_str m_color

뷰 객체

IDC_STRIDC_COLOR

③ ④

대화상자

m_str m_color

대화상자 객체

m_str m_color

뷰 객체

대화상자가생성될 때

OK 버튼을누를 때

Page 41: Visual C++ Programming  Controls 3

41

DDX/DDV (4/8)

• DDX(Dialog Data eXchange)

IDC_STRIDC_COLOR

①②

대화상자

m_str m_color

대화상자 객체

m_str m_color

뷰 객체

IDC_STRIDC_COLOR

③ ④

대화상자

m_str m_color

대화상자 객체

m_str m_color

뷰 객체

자동화 ?

Page 42: Visual C++ Programming  Controls 3

42

DDX/DDV (5/8)

• OnInitDialog(), OnOK() 함수 내부 구현

BOOL CDialog::OnInitDialog(){ ... UpdateData(FALSE); ...}

void CDialog::OnOK(){ ... UpdateData(TRUE); ...}

Page 43: Visual C++ Programming  Controls 3

43

DDX/DDV (6/8)

• CWnd::UpdateData() 함수 내부 구현

BOOL CWnd::UpdateData(BOOL bSaveAndValidate){ ... CDataExchange dx(this, bSaveAndValidate); DoDataExchange(&dx); ...}

Page 44: Visual C++ Programming  Controls 3

44

DDX/DDV (7/8)

• DDX 구현– 컨트롤의 값을 저장할 변수 선언– DoDataExchange() 함수를 자신의 프로그램에 맞게

재정의• DDX_* 매크로 사용

void CMyDialog::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyDialog) DDX_Text(pDX, IDC_STR, m_str); DDX_Text(pDX, IDC_COLOR, m_color); //}}AFX_DATA_MAP}

Page 45: Visual C++ Programming  Controls 3

45

DDX/DDV (8/8)

• DDV(Dialog Data Validation)– 대화상자의 컨트롤에 입력한 데이터의 타당성 여부를

자동으로 검사• DDV_* 매크로 사용

void CMyDialog::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyDialog) DDX_Text(pDX, IDC_STR, m_str); DDV_MaxChars(pDX, m_str, 10); DDX_Text(pDX, IDC_COLOR, m_color); DDV_MinMaxInt(pDX, m_color, 0, 255); //}}AFX_DATA_MAP}

Page 46: Visual C++ Programming  Controls 3

46

비 모드형 대화상자

• 차이점– CDialog::DoModal() 함수 대신 CDialog::Create()

함수를 이용하여 생성한다 .– 대화상자를 닫을 때 CDialog::EndDialog() 함수 대신

CWnd::DestroyWindow() 함수를 호출한다 . – 모드형 대화상자 객체는 대개 스택에 생성하지만 비

모드형 대화상자 객체는 힙에 생성한다 .

Page 47: Visual C++ Programming  Controls 3

47

대화상자 기반 응용 프로그램 (1/2)

• 대화상자 기반 응용 프로그램– 대화상자가 메인 윈도우 역할을 하는 응용 프로그램

Page 48: Visual C++ Programming  Controls 3

48

대화상자 기반 응용 프로그램 (2/2)

• InitInstance() 함수

BOOL CSimpleCalcApp::InitInstance(){ CSimpleCalcDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) {

} else if (nResponse == IDCANCEL) {

} return FALSE;}

Page 49: Visual C++ Programming  Controls 3

49

공통 대화상자 (1/10)

• MFC 클래스 계층도

Page 50: Visual C++ Programming  Controls 3

50

공통 대화상자 (2/10)

• MFC 공통 대화상자 클래스

MFC 클래스 용도 API 함수

CColorDialog 색상 선택 ChooseColor

CFileDialog 파일 열기 또는 저장 GetOpenFileName, GetSaveFileNameCFindReplaceDialo

g찾기 또는 바꾸기 FindText,

ReplaceTextCFontDialog 폰트 선택 ChooseFont

CPageSetupDialog 페 이 지 설 정 ( 페 이 지 크 기 , 방 향 , 페 이 지 여백 등 )

PageSetupDlg

CPrintDialog 인 쇄 설 정 ( 프 린 터 , 인쇄 범위 등 )

PrintDlg

CPrintDialogEx (>MFC 7.0)

인 쇄 설 정 ( 프 린 터 , 인쇄 범위 등 )

PrintDlgEx (>윈도우 2000)

MFC 클래스 용도 API 함수

Page 51: Visual C++ Programming  Controls 3

51

공통 대화상자 (3/10)

• CColorDialog

CColorDialog dlg;dlg.DoModal();COLORREF color = dlg.GetColor();

CColorDialog dlg(RGB(255, 0, 0), CC_FULLOPEN);dlg.DoModal();COLORREF color = dlg.GetColor();

Page 52: Visual C++ Programming  Controls 3

52

공통 대화상자 (4/10)

• CFileDialog

CFileDialog dlg(TRUE);if(dlg.DoModal() == IDOK) MessageBox(dlg.GetPathName());

CFileDialog dlg(FALSE);if(dlg.DoModal() == IDOK) MessageBox(dlg.GetPathName());

Page 53: Visual C++ Programming  Controls 3

53

공통 대화상자 (5/10)

• CFindReplaceDialog– 사용 방법은 교재 참조

Page 54: Visual C++ Programming  Controls 3

54

공통 대화상자 (6/10)

• CFontDialog

CFontDialog dlg;if(dlg.DoModal() == IDOK){ CClientDC dc(this); // 화면을 지운다 . CRect rect; GetClientRect(&rect); dc.SelectStockObject(WHITE_PEN); dc.SelectStockObject(WHITE_BRUSH); dc.Rectangle(&rect); // 선택된 색상을 알아낸다 . COLORREF color = dlg.GetColor(); dc.SetTextColor(color);

Page 55: Visual C++ Programming  Controls 3

55

공통 대화상자 (7/10)

• CFontDialog (cont'd)

// 선택된 폰트를 알아낸다 . LOGFONT lf; dlg.GetCurrentFont(&lf); CFont font; font.CreateFontIndirect(&lf); dc.SelectObject(&font); // 텍스트를 출력한다 . dc.TextOut(10, 10, CString(" 한글 & English"));}

Page 56: Visual C++ Programming  Controls 3

56

공통 대화상자 (8/10)

• CPageSetupDialog

CPageSetupDialog dlg;dlg.DoModal();

Page 57: Visual C++ Programming  Controls 3

57

공통 대화상자 (9/10)

• CPrintDialog

CPrintDialog dlg(TRUE);dlg.DoModal();

CPrintDialog dlg(FALSE);dlg.DoModal();

Page 58: Visual C++ Programming  Controls 3

58

공통 대화상자 (10/10)

• CPrintDialogEx

// stdafx.h 파일에서 WINVER 상수값을 0x0500 이상으로 정의한다 .

// ( 예 ) #define WINVER 0x0500

CPrintDialogEx dlg;dlg.DoModal();