Mt.Hwang 2024. 10. 24. 01:48

 * 대화 상자 (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 : 윈도우가 최소, 최대로 설정되었으면 원래 크기와 위치로 복원