Custom Dialog
개요
CGUIDialogCustom
는 리소스 뷰에서 만든 다이얼로그를 연결할 수 있는 사용자 정의 다이얼로그 클래스입니다.
![]() |
![]() |
---|
1 리소스에서 다이얼로그 만들기(MFC)
Visual Studio에서 기본 제공하는 리소스 만들기 기능을 사용하여 다이얼로그를 구성합니다.

위 다이얼로그의 리소스 아이디는 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 사용 사례
이 내용은 다음 경우에 유용합니다.
- 다이얼로그의 특정 자식 컨트롤을 멤버 변수로 선언하여 사용하고자 하는 경우
- 직접 만든 클래스로 자식 컨트롤을 대체하고자 하는 경우.
- 예: 기본 제공되는 에디트박스가 아닌, 직접 정의한
CCustomizedEdit
이라는 클래스를 만들어서 해당 클래스로 사용자 입력을 받고자 하는 경우
- 예: 기본 제공되는 에디트박스가 아닌, 직접 정의한
3.2 구현 방법
이러한 경우, 아래와 같이 구현하면 됩니다.
위 예제 코드 DialogBoardSize.h
를 보면 FLImaging::GUI::CGUIEditCtrl
객체로 선언된 변수 두 개가 있습니다. FLImaging::GUI::CGUIEditCtrl
은 CEdit
을 서브클래싱하여 만든 클래스입니다.
// 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 | ![]() |
CEdit | FLImaging::GUI::CGUIEditCtrl | ![]() |
CButton (BS_GROUPBOX) | FLImaging::GUI::CGUIGroupBox | ![]() |
CButton (BS_PUSHLIKE) | FLImaging::GUI::CGUICheckBoxPushLike | ![]() |
CButton (BS_CHECKBOX or BS_AUTOCHECKBOX) | FLImaging::GUI::CGUICheckBox | ![]() |
CButton (BS_3STATE or BS_AUTO3STATE) | FLImaging::GUI::CGUICheckBox3State | ![]() |
CButton (BS_RADIOBUTTON or BS_AUTORADIOBUTTON) | FLImaging::GUI::CGUIRadioButton | ![]() |
CSliderCtrl | FLImaging::GUI::CGUISliderStyled | ![]() |
CListCtrl | FLImaging::GUI::CGUIListCtrl | |
CTabCtrl | FLImaging::GUI::CGUITabCtrl |