visual c++ programming controls 3
Post on 04-Jan-2016
92 Views
Preview:
DESCRIPTION
TRANSCRIPT
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
3
Review: Control
• 표준화된 형태와 특성을 가진 윈도우• 사용자에게 입력을 받거나 정보를 보여줌
4
Review: 정적 컨트롤
• 정적 컨트롤 종류– 텍스트– 프레임 ( 색으로 채워지지 않은 사각형 ),
사각형 ( 색으로 채워진 사각형 ), 아이콘 , 비트맵 ,향상된 메타파일 (Enhanced Metafile)
5
Review: 편집 컨트롤
• 편집 컨트롤
• 편집 컨트롤 종류
Review: 편집 콘트롤을 제어
• 컨트롤 메시지를 주기 위해서는… CEdit 타입의 변수를 추가하고 컨트롤과 연결 직접 연결 (DoDataExchange 함수 이용 ) 또는 컨트롤의 변수 추가 기능을 이용하여 자동으로 추가
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();
8
Review: 리스트 박스 컨트롤
• 리스트 박스 컨트롤 종류
• 속성 대화상자
단일 선택리스트 박스
다중 선택리스트 박스
9
Review: 리스트 박스 컨트롤 제어 함수
• 항목 추가와 삭제
• 항목 선택
m_list.AddString(" 사과 ");m_list.DeleteString(3);
// 단일 선택 리스트 박스 컨트롤인 경우m_list.SetCurSel(2);
// 다중 선택 리스트 박스 컨트롤인 경우m_list.SetSel(2);m_list.SetSel(3, FALSE);
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);}
Announcement:
• 보강공고 :– 5 월 29 일 토요일– 오전 11 시 30 분 ~1 시 00 분– 장소 : 율곡관 304 호 실습실
12
콤보 박스 컨트롤 (1/6)
• 콤보 박스 컨트롤 종류
단순스타일
드랍다운스타일
드랍다운 리스트스타일
편집 컨트롤 정적 컨트롤
리스트박스컨트롤
13
콤보 박스 컨트롤 (2/6)
• 속성 대화상자
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
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 사용자가 항목을 선택하였다 .키보드 포커스를 얻었다 .
스타일
단순 드랍다운
드랍다운 리스트
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);}
17
콤보 박스 컨트롤 (6/6)
• 입력 가능한 문자열의 길이 제한하기
• 각종 편집 작업
m_combo.LimitText(10);
m_combo.Clear(); m_combo.Cut();m_combo.Copy();m_combo.Paste();
18
스크롤 바 컨트롤 (1/3)
• 스크롤 바 컨트롤– 화면의 일정 영역을 스크롤하거나 정해진 범위의 값을
변경시키는 용도로 사용
• 스크롤 바 코드
19
스크롤 바 컨트롤 (2/3)
• 주요 함수
멤버 함수 역할
SetScrollRange() 스크롤 박스 위치값의 최소값과 최대값을 설정한다 .
SetScrollPos() 스크롤 박스의 현재 위치를 설정한다 .
GetScrollPos() 스크롤 박스의 현재 위치를 얻는다 .
스크롤 바 컨트롤 (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
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);
코딩연습
• 다음과 같이 편집콘트롤과 , 스크롤바를 붙이고 , 스크롤바를 움직이면 편집콘트롤에 그 값을 표시하는 프로그램을 만들어 보자 . – 스크롤바의 범위 (0~100)
Dialog Box
24
개요 (1/2)
• 대화상자– 다양한 컨트롤을 포함하고 있는 일종의 윈도우– 사용자로부터 입력을 받거나 정보를 출력
25
개요 (2/2)
• 대화상자 종류– 모드형 대화상자 (modal dialog)
• 대화상자를 닫지 않으면 응용 프로그램이 더 이상 진행할 수 없다 .
– 비 모드형 대화상자 (modeless dialog)• 대화상자를 닫지 않더라도 응용 프로그램이 계속 진행할 수 있
다 .
26
대화상자 템플릿 (1/3)
• 대화상자 템플릿– 대화상자 자체와 포함된 컨트롤에 대한 모든 정보를
가지고 있는 이진 데이터– 리소스로 실행 파일에 포함
• 대화상자 템플릿 작성– 비주얼 C++ 리소스 편집기나 텍스트 편집기를
이용하여 리소스 스크립트 (*.RC) 작성– 리소스 컴파일러로 이진 파일 (*.RES) 파일 생성– 링크 과정에서 실행 파일에 포함
27
대화상자 템플릿 (2/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
29
대화상자 편집기 (1/4)
• 컨트롤 추가와 삭제– 컨트롤 (Controls) 툴바 이용
30
대화상자 편집기 (2/4)
• 컨트롤 배치– 대화상자 (Dialog) 툴 바 이용
– Format menu 이용
31
대화상자 편집기 (3/4)
• 탭 순서– Tab 키를 눌렀을 때 키보드 포커스가 이동하는 순서– [Format]->[Tab Order] 메뉴를 이용하여 변경
32
대화상자 편집기 (4/4)
• 대화상자 속성
폰트를 바꾸면 대화상자와 대화상자에 포함된 컨트롤의 크기가 폰트의 크기에 비례해서 변경된다 .폰트를 바꾸면 대화상자와 대화상자에 포함된 컨트롤의 크기가 폰트의 크기에 비례해서 변경된다 .
33
모드형 대화상자 (1/4)
• MFC 클래스 계층도
34
모드형 대화상자 (1/4)
• 모드형 대화상자 작성 순서① 대화상자 리소스 작성
Resource View
② CDialog ( 파생 ) 클래스 객체 생성 • 이 때 대화상자 리소스 ID 를 생성자의 인자로 넘겨준다 .
[Project] [add class] menu 이용
③ CDialog::DoModal() 함수 호출
35
모드형 대화상자 (2/4)
• CDialog 클래스 가상 함수
– 호출 시점 : WM_INITDIALOG 메시지 발생시– 용도 : 컨트롤을 초기화하거나 키보드 포커스를 변경
– 호출 시점 : IDOK 버튼을 누를 때– 용도 : 컨트롤의 값을 읽거나 값의 타당성 여부를 검사한
후 대화상자 종료
virtual BOOL CDialog::OnInitDialog ( );
virtual void CDialog::OnOK ( );
36
모드형 대화상자 (3/4)
• CDialog 클래스 가상 함수 (cont'd)
– 호출 시점 : IDCANCEL 버튼을 누를 때– 용도 : 대화상자 종료
virtual void CDialog::OnCancel ( );
37
모드형 대화상자 (4/4)
• OnOK(), OnCancel() 함수 내부 구현
void CDialog::OnOK(){ UpdateData(TRUE); EndDialog(IDOK);}
void CDialog::OnCancel(){ EndDialog(IDCANCEL);}
38
DDX/DDV (1/8)
• 모드형 대화상자 구현
class CMyDialog : public CDialog{ ... CString m_str; int m_color; ...}
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();}
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 버튼을누를 때
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
뷰 객체
자동화 ?
42
DDX/DDV (5/8)
• OnInitDialog(), OnOK() 함수 내부 구현
BOOL CDialog::OnInitDialog(){ ... UpdateData(FALSE); ...}
void CDialog::OnOK(){ ... UpdateData(TRUE); ...}
43
DDX/DDV (6/8)
• CWnd::UpdateData() 함수 내부 구현
BOOL CWnd::UpdateData(BOOL bSaveAndValidate){ ... CDataExchange dx(this, bSaveAndValidate); DoDataExchange(&dx); ...}
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}
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}
46
비 모드형 대화상자
• 차이점– CDialog::DoModal() 함수 대신 CDialog::Create()
함수를 이용하여 생성한다 .– 대화상자를 닫을 때 CDialog::EndDialog() 함수 대신
CWnd::DestroyWindow() 함수를 호출한다 . – 모드형 대화상자 객체는 대개 스택에 생성하지만 비
모드형 대화상자 객체는 힙에 생성한다 .
47
대화상자 기반 응용 프로그램 (1/2)
• 대화상자 기반 응용 프로그램– 대화상자가 메인 윈도우 역할을 하는 응용 프로그램
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;}
49
공통 대화상자 (1/10)
• MFC 클래스 계층도
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 함수
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();
52
공통 대화상자 (4/10)
• CFileDialog
CFileDialog dlg(TRUE);if(dlg.DoModal() == IDOK) MessageBox(dlg.GetPathName());
CFileDialog dlg(FALSE);if(dlg.DoModal() == IDOK) MessageBox(dlg.GetPathName());
53
공통 대화상자 (5/10)
• CFindReplaceDialog– 사용 방법은 교재 참조
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);
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"));}
56
공통 대화상자 (8/10)
• CPageSetupDialog
CPageSetupDialog dlg;dlg.DoModal();
57
공통 대화상자 (9/10)
• CPrintDialog
CPrintDialog dlg(TRUE);dlg.DoModal();
CPrintDialog dlg(FALSE);dlg.DoModal();
58
공통 대화상자 (10/10)
• CPrintDialogEx
// stdafx.h 파일에서 WINVER 상수값을 0x0500 이상으로 정의한다 .
// ( 예 ) #define WINVER 0x0500
CPrintDialogEx dlg;dlg.DoModal();
top related