제 04장 대화상자

Download Report

Transcript 제 04장 대화상자

제4_1장 대화상자
Kim Yeon Hee
[email protected]
목차
1.
2.
3.
4.
5.
CDialog 클래스
대화상자 기반의 프로그램
실습 4-1 MFC 기본 컨트롤 사용법 익히기
모달 대화상자와 모덜리스 대화상자
공용 대화상자
CDialog클래스
1. 대화상자

사용자와 윈도우간의 인터페이스
2. CDialog 클래스


대화상자는 CDialog 클래스로 정의
모든 윈도우 메시지 처리 가능
대화상자 기반의 프로그램
1. 대화상자 기반의 프로그램

애플리케이션 클래스와 다이얼로그 클래스로 구
성
클래스
기저 클래스
설명
애플리케이션 클래스
CWinApp
프로젝트 전체를 관리하는 클래스
다이얼로그 클래스
CDialog
대화상자의 기능을 구현하는 실제적인
클래스
도움말 대화상자 클래스 CDialog
도움말 정보 클래스
대화상자 기반의 프로그램
2. 대화상자 프로그램의 동작
대화상자 기반의 프로그램
3. 컨트롤의 핸들로 클래스와 연결하는 방법
 컨트롤의 핸들을 얻기 위해 컨트롤의 포인터를 받을
포인터 변수를 선언
 GetDlgItem() 함수를 이용하여 컨트롤의 포인터를
선언된 포인터 변수에 치환한다.
 클래스의 멤버를 이용하여 컨트롤을 다룬다.
 예)
CListBox *pList;
pList = (CListBox *)GetDlgItem(IDC_LIST1);
pList->AddString(“데이터”);
Ex)
CEdit *pEdit;
pEdit = (CEdit *)GetDlgItem(IDC_EDIT_TEXT);
pEdit -> SetFocus(); //포커스를 줌
//인수는 컨트롤의 ID
대화상자 기반의 프로그램
DoDataExchaneg()
4. Visual C++에서 DDX로 연결하는 방법
① Class Wizard에서 Member Variables탭에서 컨
트롤 ID를 선택하고 Add Variable 버튼을 누른
다
② Ctrl키를 누른 상태에서 해당 컨트롤을 더블클릭
한다.
 Category항목에서 value로 연결할 것이지 control를
연결할 것인지 선택
 Value로 연결할 경우 variable type을 선택
 Member variable name 항목에 멤버 변수 이름을 입
력
대화상자 기반의 프로그램
5. DoDataExchange() 함수



대화상자의 여러 자원을 연결하는 기능을 하는 함
수
이 함수 안에는 DDX_Text 함수나 DDX_Control
함수를 이용하여 자원과 연결
DDX_Control 형태로 연결되었을 경우는 변수가
클래스로부터 상속 받았으므로 클래스의 멤버 함
수를 마음대로 사용할 수 있다.
대화상자 기반의 프로그램
6. UpdateData() 함수

DDX_Value 형태로 연결되었을 경우는
UpdateData() 함수를 사용하여 자원을 update하
자원 = 컨트롤
여야 한다.


컨트롤에 있는 데이터를 변수에 가져오고자 한다면
UpdateData(TRUE)를 사용한다.
변수에 특정 값을 주고 그 값을 컨트롤에 보내고 싶다면
UpdateData(FALSE)를 사용한다.
대화상자 종료 : PostQuitMessage( 0 );
대화상자 기반의 프로그램
7. CListBox 클래스의 주요 멤버 함수

GetCount( )함수



인자 : AddString( 문자열 )
ListBox의 맨 뒤에 문자열을 추가할 때 사용하는 함수
GetText( )함수


ListBox의 아이템 수를 알기 위해 사용하는 함수
AddString( ) 함수

Return : 정수
Return : 문자열 // 인자 GetText( 인덱스, CString 객체 )
ListBox로부터 문자열을 얻어올 때 사용되는 함수
DeleteString( ) 함수

인자 : DeleteString( 인덱스 )
ListBox의 아이템을 삭제할 때 사용하는 함수
대화상자 기반의 프로그램
8. CComboBox 클래스의 주요 멤버 함수

ResetContent( )함수


AddString( ) 함수


ComboBox의 모든 아이템을 제거할 때 사용하는 함수
ComboBox의 맨 뒤에 문자열을 추가할 때 사용하는 함
수
GetCurSel( )함수

Return : 정수
ComboBox에서 선택된 항목의 색인을 반환하는 함수
실습 4-1
1. MFC 기본 컨트롤 사용법 익히기

이번 실습에는 MFC 에서 가장 많이 사용되는 기
본 컨트롤들을 이용하여 메인 대화상자를 만들고
사용자들의 컨트롤 사용에 따라 컨트롤의 동작을
List Box에 출력하고 Combo Box에 저장하고
삭제할 수 있는 프로그램을 작성하는 것이다.
실습 4-1
2. 실행 결과
실습 4-1
3. 프로그램 작성 순서
1) 다이얼로그 기반의 프로젝트 생성한다.
2) 메인 대화상자의 폼을 구성한다.
 컨트롤들을 배치하고 속성을 설정한다.
3) 컨트롤들을 멤버 변수와 연결한다.
4) 각 컨트롤에 대한 메시지 핸들러 함수를 생성
5) 프로그램을 실행한다
실습 4-1
4. 대화상자의 폼 구성
IDC_EDIT_NAME
1
2
3
4
8
IDC_LIST_RESULT
IDC_EDIT_PHONE
IDC_BUTTON_DELETE
5
6
7
IDC_BUTTON_INPUT
IDC_BUTTON_CLEAR IDC_BUTTON_END
실습 4-1





①
②
③
④
⑤
v
 ⑥
 ⑦
 ⑧
ID
ID
ID
ID
ID
:
:
:
:
:
IDC_RMAN, Caption :남, Group :V
IDC_RWOMAN, Caption :여
IDC_RMIPIL, Caption :미필, Group :V
IDC_RPIL, Caption :필
IDC_COMBO_VOLUMN,Vertical Scroll :
ID : IDC_CHKA , Caption :A형
ID : IDC_CHKB , Caption :B형
ID : IDC_LIST_RESULT
실습 4-1

멤버변수 선언
실습 4-1
5. 다이얼로그 박스 초기화

콤보박스 리스트 추가 (1~9)
6. 버튼 기능 코딩

입력완료 버튼




자료 입력란에 적어도 이름은 입력되어야 함
– 빈칸 체크
자료입력란의 내용을 입력하고 입력완료 버튼을 누르면 출
력자료 리스트 박스에 내용 추가
이름, 성별, 군필여부, 전화, 규격, 수량, 금액 순
– A형 : 수량 * 1000/ B형 : 수량 * 2000
리스트 박스에 추가후 후 자료 입력란 Clear
– 클리어 이후 이름 입력 창에 커서 위치
실습 4-1

선택삭제 버튼



초기화


리스트 박스에서 선택 후 선택삭제 버튼 누르면 삭제
선택하지 않은 경우 에러메시지 출력
자료 입력란 클리어
종료
모달 대화상자와 모덜리스 대화상자
1. 모달(Modal) 대화상자



모달 대화상자가 출력되면 부모 윈도우에서 작업을
할 수 없다.
모달 대화상자를 닫아야 부모 윈도우에 포커스를
둘 수 있다.
DoModal()함수를 이용하여 출력한다.
Modal 대화상자가 실행되면 부모 윈도우에
포커스를 줄 수 없다.
Modal 대화상자를 종료 시켜야 부모 윈도우에
포커스를 줄 수 있다.
생성
1. Resource view 편집 ( ID를 준다 ex.. IDD_Dialog_Test )
2. class 추가 마법사
CDialog CDialogTest; //CDialog 형으로 객체 생성
모달 대화상자와 모덜리스 대화상자
2. 모덜리스(Modeless) 대화상자
 모달 대화상자와는 달리 모덜리스 대화상자는 닫지
않고도 애플리케이션 내의 다른 윈도우에서 작업할
수 있고 다시 대화상자로 돌아와 작업할 수 있는 대
화상자
 모덜리스 대화상자의 생성 방법
① 대화상자에 대한 변수 선언 CDialog pDlg;
② Create()함수를 이용하여 대화상자 생성
③ 생성한 대화상자를 화면에 표시 ShowWindow();
모달 대화상자와 모덜리스 대화상자
3. 모덜리스 대화상자의 생성의 예
① CExDialog m_Dlg;
② m_Dlg.Create(IDD_EXDIALOG, this);
대화 상자 ID
부모 대화상자의 포인터
…..
③ m_Dlg.ShowWindow(SW_SHOW)
화면에 보여줌. // 감추기 : SW_HIDE
 Create()의 첫 번째 인수는 대화상자의 ID
 Create()의 두 번째 인수는 부모 윈도우의 포인터
공용 대화상자
1. File 대화상자


CFileDialog 클래스로 정의
생성자 함수에서 다음과 같이 호출
CFileDialog pDlg(TRUE);
pDlg.DoModal();
–
첫 번째 인수 : TRUE -> open / FALSE -> save
TRUE : Open 대화상자, FALSE : SaveAS 대화상자.
공용 대화상자
 CFileDialog의
CFileDialog(
BOOL
LPCTSTR
LPCTSTR
DWORD
생성자 함수
bOpenFileDialog, 첫 번째 인수 : TRUE -> open / FALSE -> save
두 번째 인수 : 기본 확장자를 써줌
lpszDefExt = NULL,
lpszFileName = NULL, 세 번째 인수 : 기본 파일명
dwFlags = OFN_HIDEREADONLY |
네 번째 인수 : 읽기 전용은 숨겨서 출력
OFN_OVERWRITEPROMPT, 네 번째 인수 : 덮어 쓸 때 물어 볼 것인지
OFN_FILEMUSTEXIST, 네 번째 인수 : 현재 보여지는 윈도우에 있는 내용만 불러옴
LPCTSTR
lpszFilter = NULL, 다섯 번째 인수 : 지원 가능한 확장자를 써줌
CWnd*
pParentWnd = NULL
);
공용 대화상자
2. Open 대화상자 출력 예
CFileDialog pDlg( TRUE,
//열기 Modal 상자
_T(“Text 파일(*.txt)|*.txt|", NULL, //기본 확장자 설정,기본 파일명 설정은 기본값인(NULL)
OFN_HIDEREADONLY|
//읽기 전용파일은 숨겨서 보여짐
OFN_FILEMUSTEXIST,
//현재 보여지는 파일만 불러 오는 게 가능함
_T(“Text 파일(*.txt)|*.txt|모든 파일(*.*)|*.*|,
//지원 가능한 확장자 설정
NULL);
if(pDlg.DoModal() == IDOK)
{
data = pDlg.GetPathName();
//코딩
}
공용 대화상자
3. Save 대화상자 출력 예
CFileDialog pDlg( FALSE,
//열기 Modal 상자
_T("Text 파일(*.txt)|*.txt|"), NULL,
//기본 확장자 설정,기본 파일명 설정은 기본값인(NULL)
OFN_HIDEREADONLY |
//읽기 전용파일은 숨겨서 보여짐
OFN_OVERWRITEPROMPT, //덮어 쓸 것 인지 물어봄
_T("Text 파일(*.txt)|*.txt|모든파일(*.*)|*.*|"),
//지원 가능한 확장자 설정
NULL );
if(pDlg.DoModal() == IDOK)
{
data = pDlg.GetPathName();
//코딩
}
공용 대화상자
3. Save 대화상자 출력 예
char Filter[ ] = "Text File(*.txt) | *.txt| 모든 파일(*.*) |*.*|";
CFileDialog pDlg(FALSE, "text file(*.txt)", "*.txt",
OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, Filter,
NULL);
if(pDlg.DoModal() == IDOK)
{
data = pDlg.GetPathName();
…
…
…
}
공용 대화상자
4. Font 대화상자



주로 텍스트 기반 애플리케이션에서 사용
Font 대화상자는 텍스트의 글꼴, 크기, 문자 속성
등을 지정할 수 있는 대화상자
해당 클래스는 CFontDialog
공용 대화상자


Font 대화상자 출력하는 방법
CFontDialog fontDlg;
fontDlg.DoModal();
Font를 받는 방법

폰트 구조체로 받음

실제 글꼴 생성

현재 DC의 글꼴을 선택함으로써 글꼴을 사용할 수 있다
LOGFONT logfont;
fontDlg.GetCurrentFont(&logfont);
CFont font;
font.CreateFontIndirect(&logfont);
공용 대화상자
5. Color 대화상자


사용자에게 색상을 선택하게 하는 대화상자
해당 클래스는 CColorDialog
공용 대화상자

Color 대화상자 사용법
CColorDialog colorDlg;
If (colorDlg.DoModal() == IDOK)
{
COLORREF m_color =
colorDlg.GetColor();
}