본문 바로가기
New/MFC 윈도우 프로그래밍

4. 대화상자 (2)

by onenewkong 2024. 12. 15.

4.4 모달(Modal) 대화상자와 모덜리스(Modeless) 대화상자

모달 대화상자

  • 대화상자가 출력되면 애플리케이션 내의 다른 윈도우에서 작업할 수 없음
  • 즉, 모달 대화상자를 닫아야 애플리케이션 내의 다른 윈도우에 포커스를 둘 수 있음
  • 모달 대화상자는 DoModal() 함수를 이용하여 출력함

모덜리스 대화상자

  • 모덜리스 대화상자를 종료하지 않아도 다른 윈도우에서 사용자 작업을 계속 수행할 수 있음
  • 모덜리스 대화상자는 다음과 같은 과정을 거쳐 출력
CExDialogDlg m_Dlg;
m_Dlg.Create(IDD_EXDIALOG, this);
                          ⇩
m_Dlg.ShowWindow(SW_SHOW);
  • 출력할 대화상자 클래스에 대한 변수 선언
  • Create() 함수를 사용하여 대화상자를 만듬
  • 이때 첫 번째 파라미터는 대화상자의 ID
  • 두 번째는 부모 윈도우의 포인터 (CWnd)를 넘겨줌
  • 두 번째는 대화상자를 화면에 보여줘야 하므로 ShowWindow() 함수를 호출함

 

4.5 공용 대화상자

MFC에서는 대부분 애플리케이션에 들어가는 공통적인 대화상자들을 클래스로 만들어 놓았는데 이를 공용 대화상자라 한다.

(1) 파일 대화상자

  • 파일의 열기, 저장, 다른 이름으로 저장의 동작을 할 때 사용되는 대화상자임
  • 파일 대화상자는 CFileDialog 클래스로 정의되어 있는데 이를 사용하기 위해서 CFileDialog 클래스의 생성자 함수를 호출함
CFileDialog pDlg(TRUE);
pDlg.DoModal();
  • 생성자 함수의 인수가 true일 때는 Open 대화상자로 지정되고, false일 때는 SaveAs 대화상자로 지정됨
  • 그 다음에 DoModal() 함수를 이용하여 대화상자를 출력하게 됨
  • 한 개의 파라미터만 주면 파일 형식에 대한 정의가 없음
  • 이를 지정하기 위해서는 CFileDialog 클래스 생성자 함수에서 매개변수로 지정해줌
파라미터 설명
bOpenFileDialog Open(TRUE)인지 Save(FALSE)인지를 나타냄
lpszDefExt 확장자가 없는 파일명에 추가되어야 하는 파일 확장자 (디폴트 확장자)
lpszFileName 초기에 선택해야 하는 파일명 (디폴트 파일명)
dwFlags 보여질 파일의 속성을 지정하는 플래그
lpszFilter 검색할 파일형태의 필터
pParentWnd 부모 윈도우의 포인터
  • Save 대화상자는 Open 대화상자의 동작과 매우 유사함
  • 다른 점은 CFileDialog의 생성자 함수에 전달하는 인수가 다름

(2) 폰트 대화상자

  • 주로 텍스트 기반의 애플리케이션에서 사용됨
  • 텍스트의 글꼴이나 크기, 문자 속성 등을 지정할 수 있는 대화상자이며 해당 클래스는 CFontDialog임
CFontDialog fontDlg;
fontDlg.DoModal();

(3) 색상 대화상자

  • 사용자에 의해 색을 선택하게 하는 공용 대화상자
  • 해당 클래스는 CColorDialog
  • DoModal() 함수를 통해 불러온 뒤 GetColor() 함수를 통해 선택된 색상 값을 저장하여 사용하면 됨
CColorDialog colorDlg;
if (colorDlg.DoModal() == IDOK)
{
    COLORREF m_color = colorDlg.GetColor();
}

 

실습

Unity UI나 Java GUI, Python GUI 등 그동안 경험했던 UI들과 느낌이 비슷해서 금방 머리에 들어온다. 다른 점은 요소 하나에 함수 하나로 처리하고 있다는 점 정도인 듯하다. (아직까지는). Unity는 사실 엔진이라, 정말 쉽게 UI에 기능을 넣을 수 있었다. 요소의 위치도 피벗과 위치 값으로 조정할 수 있는데, MFC는 내가 아직 얼마 안해봐서 모르는건가? 손으로 위치 조정하는 게 어렵다. 잘 보면 삐뚤빼뚤하다. Java GUI는 판넬 위에 하나씩 올린다는 생각으로 하다보면 금방 익힐 수 있었고, 안드로이드와도 비슷해서 나중에 안드로이드 할 때 재밌게 했던 기억이 있다. 암튼 MFC도 재밌는 것 같아서 요즘 열심히 공부하고 있다. 이러다가 모든 언어 별로 UI 개발 할 것 같다........