제4장 대화상자
대화상자 대화상자 CDialogEx 클래스 사용자와 윈도우간의 인터페이스 대화상자는 CDialogEx 클래스로 정의 모든 윈도우 메시지 처리 가능 배경색과 배경그림 바꾸는 기능 추가 SetBackgroundColor() SetBackgroundImage()
대화상자 대화상자의 계층도
대화상자 다이얼로그 기반의 프로그램 애플리케이션 클래스와 다이얼로그 클래스로 구성 클래스 기저 클래스 설 명 CWinApp 프로젝트 전체를 관리하는 클래스 다이얼로그 클래스 CDialogEx 대화상자의 기능을 구현하는 실제적인 클래스 도움말 대화상자 클래스 도움말 정보 클래스
대화상자 대화상자 프로그램의 동작
MFC 기본 컨트롤 Static Text Edit Control Group Box 화면에 문자열을 배치할 때 사용하는 컨트롤 문자열을 입력하고 편집할 수 있는 컨트롤 Group Box 서로 연관된 컨트롤을 시각적으로 그룹 지어 다른 컨트롤과 구분하는 용도로 사용 그룹 박스로 묶는다고 기능은 변경되지 않음
MFC 기본 컨트롤 Button Control Check Box 마우스로 클릭하여 어떤 동작을 수행하는 용도로 사용하는 컨트롤 마우스로 클릭하여 어떤 동작을 수행하는 용도로 사용하는 컨트롤 Check Box 버튼 컨트롤의 일종으로 독립적인 옵션을 선택할 때 사용하는 컨트롤 마우스로 클릭하면 체크표시가 on/off 됨 여러 옵션 중 임의의 개수를 선택할 때 사용
MFC 기본 컨트롤 Radio Button List Box 버튼 컨트롤의 일종으로 상호 배타적인 옵션을 선 택할 때 사용하는 컨트롤 마우스로 클릭하면 라디오 표시가 on/off 됨 여러 옵션 중 하나 만 선택할 때 사용 List Box 여러 개의 선택 항목을 나열하고 선택할 수 있도록 해주는 컨트롤 하나 도는 여러 개를 선택할 수 있음
MFC 기본 컨트롤 Combo Box 리스트 박스의 단점을 해결한 것으로 에디트 컨트롤과 리스트 박스를 합쳐 놓은 모양 리스트 박스의 단점을 해결한 것으로 에디트 컨트롤과 리스트 박스를 합쳐 놓은 모양 기존의 항목을 선택할 때는 아래의 리스트 박스에서 선택 직접 입력할 경우는 에디트 컨트롤에서 입력할 수 있음 리스트 박스를 평소에 닫아두기 때문에 화면면적을 넓게 차지하지 않음.
실습 4-1 MFC 기본 컨트롤 사용법 익히기 이번 실습에는 MFC 에서 가장 많이 사용되는 기본 컨트롤들을 이용하여 메인 대화상자를 만들고 사용자들의 컨트롤 사용에 따라 컨트롤의 동작을 List Box에 출력하고 Combo Box에 저 장하고 삭제할 수 있는 프로그램을 작성하는 것이다.
실습 4-1 실행 결과
실습 4-1 프로그램 작성 순서 다이얼로그 기반의 프로젝트 생성한다. 메인 대화상자의 폼을 구성한다. 컨트롤들을 배치하고 속성을 설정한다. 컨트롤들을 멤버 변수와 연결한다. 각 컨트롤에 대한 메시지 핸들러 함수를 생성 프로그램을 실행한다
실습 4-1 대화상자의 폼 구성 왼쪽의 컨트롤 도구상자에서 컨트롤들을 선택하여 오른쪽 대화상자와 같이 배치한다.
실습 4-1 컨트롤을 멤버변수와 연결하는 방법 DDX를 이용하는 방법 Value : Control : 컨트롤에 설정되어 있는 값만 연결 DDX_Text 계열 함수를 이용하여 자원에 연결 Control : 해당 컨트롤을 제어할 수 있는 컨트롤 클래스와 연결 DDX_Control 계열 함수를 이용하여 자원에 연결
실습 4-1 컨트롤을 멤버변수와 연결하는 방법 컨트롤의 핸들로 클래스와 연결하는 방법 컨트롤의 핸들을 얻기 위해 컨트롤의 포인터를 받 을 포인터 변수를 선언 GetDlgItem() 함수를 이용하여 컨트롤의 포인터 를 선언된 포인터 변수에 치환한다. 클래스의 멤버를 이용하여 컨트롤을 다룬다. 예) CListBox *pList; pList = (CListBox *)GeDlgItem(IDC_LIST1); pList->AddString(“데이터”);
실습 4-1 Visual C++에서 DDX로 연결하는 방법 클래스 마법사에서 [멤버 변수]탭에서 컨트롤 ID를 선택하고 [변수추가]버튼을 누른다 Ctrl키를 누른 상태에서 해당 컨트롤을 더블클릭한다. [멤버 변수 이름] 항목에 멤버 변수 이름을 입력 [범주]항목에서 value로 연결할 것이지 control를 연결할 것인 지 선택 Value로 연결할 경우 변수형식을 선택
실습 4-1 DoDataExchange() 함수 대화상자의 여러 자원을 연결하는 기능을 하는 함수 이 함수 안에는 DDX_Text 함수나 DDX_Control 함수를 이용하 여 자원과 연결 DDX_Control 형태로 연결되었을 경우는 변수가 클래스로부터 상속 받았으므로 클래스의 멤버 함수를 마음대로 사용할 수 있 다.
실습 4-1 UpdateData() 함수 DDX_Value 형태로 연결되었을 경우는 UpdateData() 함수를 사용하여 자원을 update하여야 한다. 컨트롤에 있는 데이터를 변수에 가져오고자 한다면 UpdateData(TRUE)를 사용한다. 변수에 특정 값을 주고 그 값을 컨트롤에 보내고 싶다면 UpdateData(FALSE)를 사용한다.
실습 4-1 CListBox 클래스의 주요 멤버 함수 GetCount( )함수 AddString( ) 함수 GetText( )함수 ListBox로부터 문자열을 얻어올 때 사용되는 함수 DeleteString( ) 함수 ListBox의 아이템을 삭제할 때 사용하는 함수
실습 4-1 CComboBox 클래스의 주요 멤버 함수 ResetContent( )함수 AddString( ) 함수 GetCurSel( )함수 ComboBox에서 선택된 항목의 색인을 반환하는 함수
대화상자 모달(Modal) 대화상자 모달 대화상자가 출력되면 부모 윈도우에서 작업을 할 수 없다. 모달 대화상자를 닫아야 부모 윈도우에 포커스를 둘 수 있다. DoModal()함수를 이용하여 출력한다.
대화상자 모덜리스(Modeless) 대화상자 모달 대화상자와는 달리 모덜리스 대화상자는 닫지 않고도 애 플리케이션 내의 다른 윈도우에서 작업할 수 있고 다시 대화상 자로 돌아와 작업할 수 있는 대화상자 모덜리스 대화상자의 생성 방법 대화상자에 대한 변수 선언 Create()함수를 이용하여 대화상자 생성 생성한 대화상자를 화면에 표시
대화상자 모덜리스 대화상자의 생성의 예 CExDialogDlg m_Dlg; m_Dlg.Create(IDD_EXDIALOG, this); ….. m_Dlg.ShowWindow(SW_SHOW) Create()의 첫 번째 인수는 대화상자의 ID Create()의 두 번째 인수는 부모 윈도우의 포인터
공용 대화상자 CFileDialog pDlg(TRUE); pDlg.DoModal(); File 대화상자 생성자 함수에서 다음과 같이 호출 CFileDialog pDlg(TRUE); pDlg.DoModal(); TRUE : Open 대화상자, FALSE : SaveAS 대화상자.
공용 대화상자 CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );
공용 대화상자 char Filter[ ] = "Text File(*.txt) | *.txt| 모든 파일(*.*)|*.*|"; Open 대화상자 출력 예 char Filter[ ] = "Text File(*.txt) | *.txt| 모든 파일(*.*)|*.*|"; CFileDialog pDlg(TRUE, "text file(*.txt)", "*.txt", OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, Filter, NULL); if(pDlg.DoModal() == IDOK) { data = pDlg.GetPathName(); … }
공용 대화상자 char Filter[ ] = "Text File(*.txt) | *.txt| 모든 파일(*.*) |*.*|"; 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(); … }
공용 대화상자 주로 텍스트 기반 애플리케이션에서 사용 Font 대화상자 주로 텍스트 기반 애플리케이션에서 사용 Font 대화상자는 텍스트의 글꼴, 크기, 문자 속성 등 을 지정할 수 있는 대화상자 해당 클래스는 CFontDialog
공용 대화상자 Font 대화상자 출력하는 방법 Font를 받는 방법 CFontDialog fontDlg; fontDlg.DoModal(); Font를 받는 방법 폰트 구조체로 받음 LOGFONT logfont; fontDlg.GetCurrentFont(&logfont); 실제 글꼴 생성 CFont font; font.CreateFontIndirect(&logfont); 현재 DC의 글꼴을 선택함으로써 글꼴을 사용할 수 있다
공용 대화상자 Color 대화상자 사용자에게 색상을 선택하게 하는 대화상자 해당 클래스는 CColorDialog
공용 대화상자 If (colorDlg.DoModal() == IDOK) { CColorDialog colorDlg; If (colorDlg.DoModal() == IDOK) { COLORREF m_color = colorDlg.GetColor(); }
실습 4-2 단위 변환 프로그램 만들기 이번 실습에서는 대화상자 기반으로 하여 단위 변환이 가 능한 대화상자를 만들고 변환 단위 표를 열람하는 프로그 램을 작성할 것이다. Edit Control를 통해 현재 값을 입력하 고, ComboBox에 저장 되어있는 단위들을 선택하여 현재 단위에서 다른 단위로 변환이 가능하게 할 것이다. 변환하 고 싶은 단위 표를 열람하기 위해서 모덜리스 대화상자를 이용할 것이다.
실습 4-2 실행 결과
실습 4-2 프로그램 작성 순서 대화상자 기반의 프로젝트 생성한다. 메인 대화상자의 폼을 구성한다. 컨트롤들을 배치하고 속성을 설정한다. 각각 컨트롤들을 멤버 변수와 연결한다. Radio Button 컨트롤에 대한 메시지 핸들러 함수를 생성 값을 변환하기 위한 Button 컨트롤에 대한 메시지 핸들러 함수 를 생성
실습 4-2 변환 단위표를 열람할 수 있는 모덜리스 대화상자를 생성 모덜리스 형식으로 [변환 단위표]를 출력 새로운 대화상자를 생성하고, 속성을 설정 새로 생성된 대화상자에 컨트롤을 배치 새로 만든 대화상자 자원을 다룰 클래스를 생성 모덜리스 형식으로 [변환 단위표]를 출력 프로그램을 실행한다
실습 4-2 CWnd 클래스 멤버 함수 GetWindowRect( ) 함수 MoveWindow( ) 함수 윈도우의 크기를 알기 위해 사용하는 함수 MoveWindow( ) 함수 윈도우의 위치와 크기를 변경하는 함수
연습문제 4-1 표준 컨트롤을 이용한 데이터 이동 가능 대화상자 만 들기 대화상자에 있는 버튼을 이용하여 에디트 박스에 데이터를 입 력하고 배치되어 있는 버튼을 누르면 데이터가 이동, 복사가 되는 간단한 데이터 복사 이동 프로그램을 작성하라.
연습문제 4-1 실행 결과 데이터 입력 및 복사 데이터 입력 및 이동