04장. 대화상자
* 대화 상자 (Dialog Box)
사용자와 윈도우 간의 인터페이스 기능
* CDialogEx 클래스 계층도
CObject
ㄴ CCmdTarget
ㄴㄴ CWnd
ㄴㄴㄴ CDialog
ㄴㄴㄴㄴ CDialogEx
CDialog 클래스는 CWnd를 상속한 클래스이므로
모든 윈도우 메시지 처리 ㄱㄴ
CDialogEx는 CDialog의 모든 기능을 수행하면서
대화상자의 색, 그림을 바꿀 수 있는 기능 있음
* 대화상자 기반 프로그램
1. 애플리케이션 클래스
2. 대화상자 클래스
3. 도움말 대화상자 클래스
애프릴케이션 클래스
기저 클래스 : CWinApp
프로젝트 전체를 관리하는 클래스
대화상자 클래스
기저 클래스 : CDialogEx
대화 상자의 기능을 구현하는 실제적인 클래스
도움말 대화상자 클래스
기저 클래스 : CDialogEx
도움말 정보 클래스
* 대화 상자 프로그램 실행 순서
대화상자 프로그램 실행
-> 생성자 함수 호출
-> OnCreate() 호출
-> OnInitDialog() 호출
ㄴ 초기화를 여기서 함
ㄴ 대화 상자의 컨트롤들을 초기화
-> OnPaint()
ㄴ OnDraw()와 같은 기능
-> OnClose()
-> OnDestroy()
-> 종료
* 컨트롤 Control
사용자와 인터페이스를 이루는 도구
컨트롤을 통해 사용자로부터 명령과 정보를 받고
컨트롤을 통해 사용자에게 결과를 보고
* MFC 기본 컨트롤
Static Text
화면에 문자열을 배치
레이블 용도로 사용
기능적인 요소는 없다
Edit Control
문자열을 입력받음
Group Box
서로 연관된 컨트롤들을 시각적으로 묶어줌
다른 컨트롤과 구분되게끔
기능적인 요소는 없다
Button Control
마우스로 클릭하여
어떤 동작을 수행할지 결정
Check Box
Button Control의 일종으로
on/off 체크 표시가 됨
여러 옵션 중 임의의 개수를 선택할 때 사용
Radio Button
Button Control의 일종으로
on/off 체크 표시가 됨
여러 옵션 중 하나만 선택할 때 사용
하나를 선택하면 다른 것들이 선택 해제되는 상호 배타적인 옵션
List Box
사용자가 선택할 수 있는 항목들을 나열
스타일에 따라 하나 혹은 여러 개 선택 가능
리스트들이 정해져 있다
인덱스로 관리
Combo Box
Ediot Control과 List Box를 합쳐놓은 형태
List Box의 단점 해결
사용자가 추가한 항목들이 보여지는 것 같다
* 컨트롤 구성 요소
캡션
대화 상자에서 표시되는 제목
고유 ID
컨트롤이 가지고 있는 일련번호
고유 ID를 이용해서 소스 코드와 매핑시킨다
* 컨트롤과 멤버 변수 연결 방법
1. DDX (값/컨트롤)를 이용하는 방법
(1) 클래스 마법사 사용
(2) 멤버 변수 추가 마법사 사용
2. 컨트롤의 핸들을 가져와서 연결하는 방법
컨트롤에 ctrl + 더블 클릭을 하는 방법과
컨트롤에 마우스 우클릭 -> 변수 추가를 하는 방법도 있다
컨트롤로 연결
컨트롤의 핸들을 가져와서 연결하는 방식
아마 컨트롤이 주가 돼서 소스 코드를 변경시키는 것 같다
컨트롤 클래스로 매핑된다
ex) CListBox, CComboBox
값 형태 연결은 DDX_Text 계열
컨트롤 형태 연결은 DDX_Control
DDX_Control 연결
컨트롤 자체를 핸들링하는 클래스의 멤버 함수를 사용
* 컨트롤 핸들러 함수
클래스 마법사 실행
-> 명령 탭에서 고유 ID 찾고
-> 필요한 메시지 선택
클래스 뷰에서 C...Dlg 클래스를 선택하고 마우스 우클릭
-> 추가 -> 함수 추가
* CListBox::GetCount()
리스트 박스의 아이템 수를 알기 위해 사용하는 함수
int GetCount() const
사용은 ListBox.GetCount()
* CComboBox::ResetContent()
콤보 박스의 모든 아이템을 제거할 때 사용
void ResetContent()
사용은 ComboBox.ResetContent()
AddString()은 콤보 박스와 리스트 박스 모두 구현되어 있다
* CComboBox::AddString()
콤보 박스의 리스트 박스에 문자열을 추가할 때 사용
int AddString(LPCTSTR lpszString)
lpszString
추가하고자 하는 문자열
사용은 ComboBox.AddString(문자열)
* CListBox::AddString()
리스트 박스의 맨 뒤에 문자열을 추가
int AddString(LPCTSTR lpszItem)
lpszItem
추가하고자 하는 문자열
사용은 ListBox.AddString(문자열)
* UpdateComboBox()
콤보 박스를 갱신하는 함수인 것 같다
변수 추가에서 배열은 잘 안 되는 경우가 있음
이 경우 해당 헤더 파일로 이동해서 배열 변수 추가
* UpdateData()
매개 변수가 TRUE일 때는
컨트롤의 데이터를 소스 코드의 멤버 변수로 가져옴
매개 변수가 FALSE일 떄는
멤버 변수의 내용을 컨트롤에 세팅
즉,
TRUE이면 대화 상자(컨트롤) -> 소스 코드
FALSE이면 소스 코드 -> 대화 상자(컨트롤)
컨트롤이 값 형태로 연결되었을 때 선택
컨트롤 형태로 연결됐을 떄는 자체적으로 핸들링하는 멤버 변수를 사용하기 때문
디폴트 값은 TRUE
BOOL UpdateData(BOOL bSaveAndValidate = TRUE)
사용은 UpdateData()
핸들러 함수에서의 사용은
1. UpdateData(TRUE)
2. 메시지 처리 루틴
3. UpdateData(FALSE)
* CString::IsEmpty()
CString 객체의 문자열 버퍼가 비어있는지 체크
BOOL IsEmpty() const
1. 문자열 버퍼가 비어 있으면 true
2. 비어있지 않으면 false
* CString::Empty()
CString 객체의 문자열을 삭제하여 비우는 데 사용
void Empty()
* CComboBox::GetCurSel()
콤보 박스에서 선택된 항목의 index 반환
없으면 CB_ERR 반환
index는 0부터 시작
int GetCurSel() const
사용은 ComboBox.GetCurSel()
* CListBox::GetText()
리스트 박스에서 주어진 index의 문자열을 얻어올 때 사용
index는 0부터 시작
void GetText(int nIndex, CString & rString) const
nIndex
리스트 박스에서 문자열을 가져오고 싶은 아이템의 index
rString
문자열을 저장할 CString 객체
사용은 ListBox.GetText(인덱스, str)
* CListBox::DeleteString()
리스트 박스의 아이템을 삭제할 때 사용
int DeleteString(UINT nIndex)
nIndex
삭제하고자 하는 리스트 박스의 index
사용은 ListBox.DeleteString(인덱스)
* 모달 대화 상자 (Modal)
경고 창과 같은 대화 상자
다른 윈도우 활성화 불가능
DoModal()을 이용해 출력
* 모덜리스 대화 상자 (Modeless)
굳이 모덜리스 대화 상자를 종료시키지 않아도
다른 윈도우에서 사용자 작업 가능
모덜리스 대화 상자 실행 방법은
1. 대화 상자 클래스에 대한 변수 선언
2. Create()로 대화 상자 만들기
ㄴ 첫 번째 매개변수는 대화 상자의 ID
ㄴ 두 번째 매개변수는 부모 윈도우의 포인터
3. ShowWindow()
코드는
CExDialogDlg m_Dlg;
m_Dlg.Create(IDD_EXDIALOG, this);
m_Dlg.ShowWindow(SW_SHOW);
* 공용 대화 상자
대부분의 애플리케이션에 들어가는 공통적인 대화 상자들
파일 대화 상자, 폰트 대화 상자, 색상 대화 상자 등이 있다
* 파일 대화 상자
파일의 열기, 저장, 다른 이름으로 저장 동작을 할 때 사용
클래스는 CFileDialog
실행 함수는 CFileDialog.Modal()
실행 코드는
CFileDialog pDlg(TRUE);
pDlg.DoModal();
1. 생성자 함수의 인자가 true일 때는 Open 대화 상자로 지정
2. 생성자 함수의 인자가 false일 때는 SaveAs 대화 상자로 지정
CFileDialog()의 원형
CFIleDialog(
BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd * pParentWnd = NULL
);
bOpenFileDialog
OPEN인지 SAVE인지 나타냄
lpszDefExt
디폴트 확장자
ex) _T("*.txt")
lpszFileName
디폴트 파일명
ex) _T("text file(*.txt)")
dwFlags
보여질 파일의 속성을 지정하는 플래그
lpszFilter
검색할 파일 형태의 필터
pParentWnd
부모 윈도우의 포인터
* 폰트 대화 상자
텍스트의 글꼴, 크기, 문자 속성 등 지정
클래스는 CFontDialog
실행 함수는 CFontDialog.Modal()
실행 코드는
CFontDialog fontDlg();
fontDlg.DoModal();
사용자가 선택한 폰트를 받는 방법은
LOGFONT logfont;
fontDlg.GetCurrentFont(&logfont);
실제 글꼴 생성은
CFont font;
font.CreateFontIndirect(&logfont);
* 색상 대화 상자
사용자에 의해 색을 선택하게 하는 공용 대화 상자
클래스는 CColorDialog
DoModal() 함수를 통해 불러오고
GetColor() 함수를 통해 선택한 색상 값 저장
ex)
CColorDialog colorDlg;
if (colorDlg.DoModal() == IDOK)
COLORREF m_color = colorDlg.GetColor();
서식 -> 대화 상자 테스트
* CListBox::SetCurSel()
리스트 박스에서 지정된 index 아이템을 선택
index는 0부터 시작
선택 커서가 대기돼 있는 인덱스 선택
대기 표시가 떠 있는 인덱스 선택
int SetCurSel(int nSelect)
nSelect
선택할 문자열의 index
-1이면 아이템이 선택되지 않는다
에러가 발생하면
LB_ERR을 반환
사용은 ListBox.SetCurSel(int)
* 대화 상자 만들기
리소스 뷰
-> Dialog 우클릭 -> 삽입
대화 상자는 소스 코드의 클래스와 연결돼 있다
모덜리스 대화 상자의 경우
bool 타입 변수를 통해서 on/off 한다
* CWnd::GetWindowRect()
윈도우의 크기를 알기 위해 사용하는 함수
void GetWindowRect(LPRECT lpRect) const
lpRect
윈도우의 좌표를 받는 CRect 클래스의 포인트
사용은 GetWindowRect(&CRect 객체)
혹은 대화상자클래스.GetWindowRect(&CRect 객체)
* Cwnd::MoveWindow()
윈도우의 위치와 크기를 변경하는 함수
void MoveWindow(int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE)
x
새로운 왼쪽 스크린 좌표
y
새로운 위쪽 스크린 좌표
nWidth
윈도우의 새로운 너비
nHeight
윈도우의 새로운 높이
bRepaint
윈도우를 새로 그릴 것인지 명시하는 플래그
사용은 대화상자클래스.MoveWindow(x 좌표, y 좌표, 너비, 높이, 플래그)
* CWnd::ShowWindow()
윈도우를 화면에 보일 상태를 설정
BOOL ShowWindow(int nCmdShow)
nCmdShow
CWnd가 화면에 보이는 방법을 명시
사용은 대화상자클래스.ShowWindow(플래그)
SW_HIDE : 윈도우가 화면에 보이지 않게 함
SW_MINIMIZE : 윈도우 최소화
SW_RESTORE : 윈도우를 원래의 크기와 위치로 화면에 표시
SW_SHOW : 윈도우를 화면에 보이게 함
SW_SHOWMAXIMIZED : 위도우를 최대한 크게 하여 표시
SW_SHOWMINIMIZED : 윈도우를 최소한 작게 하여 표시
SW_SHOWMINNOACTIVE : 윈도우를 아이콘으로 표시
SW_SHOWNA : 윈도우를 현재 상태로 표시
SW_SHOWNOACTIVTE : 윈도우를 가장 최근의 크기와 위치로 표시
SW_SHOWNORMAL : 윈도우가 최소, 최대로 설정되었으면 원래 크기와 위치로 복원