Custom Dialog

개요

CGUIDialogCustom는 리소스 뷰에서 만든 다이얼로그를 연결할 수 있는 사용자 정의 다이얼로그 클래스입니다.

Default Dialog Custom Dialog
Fig. 기본 다이얼로그(좌) 커스텀 다이얼로그(우)

위 그림을 보면, 기본 다이얼로그는 Windows에서 제공하는 기본 디자인으로 나타납니다. 반면 커스텀 다이얼로그는 색상과 디자인 등을 변경하기 용이합니다.

1 리소스에서 다이얼로그 만들기(MFC)

Visual Studio에서 기본 제공하는 리소스 만들기 기능을 사용하여 다이얼로그를 구성합니다.

Dialog
Fig. Dialog

위 다이얼로그의 리소스 아이디는 IDD_DIALOG_BOARDSIZE 이며 "Apply" 버튼의 리소스 아이디는 IDC_BUTTON_APPLY 입니다.

2 이벤트 처리기 추가

2.1 클래스 추가

위 다이얼로그에 연결된 MFC 클래스(CDialogBoardSize)를 추가하고, 해당 클래스가 FLImaging::GUI::CGUIDialogCustom을 상속받도록 합니다.

// DialogBoardSize.h
#pragma once

namespace FLImaging
{
	namespace GUI
	{
		class CDialogBoardSize : public FLImaging::GUI::CGUIDialogCustom
		{
			DECLARE_DYNAMIC(CDialogBoardSize)

		public:
			CDialogBoardSize(CWnd* pParent = nullptr);
			virtual ~CDialogBoardSize();

		protected:
			virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
			#ifdef AFX_DESIGN_TIME
			enum {
				IDD = IDD_DIALOG_BOARDSIZE
			};
			#endif

		protected:
			CGUIEditCtrl m_wndEditWidth;
			CGUIEditCtrl m_wndEditHeight;

		public:
			virtual BOOL OnInitDialog() override;
			DECLARE_MESSAGE_MAP()
            // "Apply" button click event
			afx_msg void OnBnClickedButtonApply(); 
		};
	}
}

2.2 버튼 이벤트 처리기 추가

위 c++ 코드를 보면 afx_msg void OnBnClickedButtonApply(); 함수 선언을 볼 수 있습니다. 이 함수는 Apply 버튼에 대한 이벤트 처리기입니다. 아래 코드와 같이 cpp 파일에서 메시지 맵에 ON_BN_CLICKED(IDC_BUTTON_APPLY, &CDialogBoardSize::OnBnClickedButtonApply) 를 추가하고, OnBnClickedButtonApply() 함수 구현부를 작성하면 됩니다.

// DialogBoardSize.cpp
#include "pch.h"
#include "DialogBoardSize.h"

using namespace FLImaging;
using namespace FLImaging::Base;
using namespace FLImaging::GUI;
using namespace FLImaging::Foundation;

IMPLEMENT_DYNAMIC(CDialogBoardSize, CGUIDialogCustom)

BEGIN_MESSAGE_MAP(CDialogBoardSize, CGUIDialogCustom)
	ON_BN_CLICKED(IDC_BUTTON_APPLY, &CDialogBoardSize::OnBnClickedButtonApply)
END_MESSAGE_MAP()

CDialogBoardSize::CDialogBoardSize(CWnd* pParent /*=nullptr*/)
	: CGUIDialogCustom(IDD_DIALOG_BOARDSIZE, pParent)
{
}

CDialogBoardSize::~CDialogBoardSize()
{
}

void CDialogBoardSize::OnBnClickedButtonApply()
{
	CGUIMessageBox::DoModal(L"Apply button clicked");
}

3 다이얼로그의 자식 컨트롤 변수 선언 및 연결(DDX_Control)

3.1 사용 사례

이 내용은 다음 경우에 유용합니다.

  1. 다이얼로그의 특정 자식 컨트롤을 멤버 변수로 선언하여 사용하고자 하는 경우
  2. 직접 만든 클래스로 자식 컨트롤을 대체하고자 하는 경우.
    • 예: 기본 제공되는 에디트박스가 아닌, 직접 정의한 CCustomizedEdit이라는 클래스를 만들어서 해당 클래스로 사용자 입력을 받고자 하는 경우

3.2 구현 방법

이러한 경우, 아래와 같이 구현하면 됩니다.

위 예제 코드 DialogBoardSize.h를 보면 FLImaging::GUI::CGUIEditCtrl 객체로 선언된 변수 두 개가 있습니다. FLImaging::GUI::CGUIEditCtrlCEdit을 서브클래싱하여 만든 클래스입니다.

// DialogBoardSize.h
protected:
    CGUIEditCtrl m_wndEditWidth;
    CGUIEditCtrl m_wndEditHeight;

자식 컨트롤에 자주 접근할 경우, 또는 기본 컨트롤 클래스(예: CEdit)가 아닌 다른 클래스(예: CGUIEditCtrl)로 서브클래싱 하고자 하는 경우에는 위와 같이 자식 컨트롤 변수를 선언하고 아래와 같이 void CDialogBoardSize::DoDataExchange(CDataExchange* pDX)에서 리소스 아이디와 컨트롤 변수를 연결하면 됩니다.

// DialogBoardSize.cpp
void CDialogBoardSize::DoDataExchange(CDataExchange* pDX)
{
	CGUIDialogCustom::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_EDIT_WIDTH, m_wndEditWidth);
	DDX_Control(pDX, IDC_EDIT_HEIGHT, m_wndEditHeight);
}

BOOL CDialogBoardSize::OnInitDialog()
{
	BOOL bResult = CGUIDialogCustom::OnInitDialog();

	// 다이얼로그 창 생성 이후 추가로 초기화할 내용을 작성합니다(Optional). 
	if(m_wndEditWidth.GetSafeHwnd())
		m_wndEditWidth.SetWindowText(L"0");
	
	if(m_wndEditHeight.GetSafeHwnd())
		m_wndEditHeight.SetWindowText(L"0");

	return bResult;
}

4 기본 컨트롤 클래스

CGUIDialogCustom클래스에서는 기본 컨트롤 클래스를 아래와 같이 서브클래싱하여 사용합니다. 따라서 컨트롤을 멤버 변수로 선언하기 위해서는 아래 클래스명을 참고하세요. 예를 들어 콤보박스 컨트롤에 대한 멤버 변수는 CComboBox m_wndCombo; 와 같이 선언하는 것이 아니라 CGUIComboBox m_wndCombo; 와 같이 선언해야 합니다.

컨트롤 클래스 이름 미리보기
CComboBox FLImaging::GUI::CGUIComboBox ComboBox
CEdit FLImaging::GUI::CGUIEditCtrl EditCtrl
CButton (BS_GROUPBOX) FLImaging::GUI::CGUIGroupBox GroupBox
CButton (BS_PUSHLIKE) FLImaging::GUI::CGUICheckBoxPushLike PushLikeButton
CButton (BS_CHECKBOX or BS_AUTOCHECKBOX) FLImaging::GUI::CGUICheckBox CheckBox
CButton (BS_3STATE or BS_AUTO3STATE) FLImaging::GUI::CGUICheckBox3State CheckBox3State
CButton (BS_RADIOBUTTON or BS_AUTORADIOBUTTON) FLImaging::GUI::CGUIRadioButton RadioButton
CSliderCtrl FLImaging::GUI::CGUISliderStyled Slider
CListCtrl FLImaging::GUI::CGUIListCtrl
CTabCtrl FLImaging::GUI::CGUITabCtrl