Embedded Custom Dialog
개요
CGUIDialogCustomEmbedded
는 리소스 뷰에서 만든 다이얼로그를 부모 창(dockable pane 등)의 자식으로 추가할 수 있는 사용자 정의 다이얼로그 클래스입니다.
미리보기

위 그림에서 보이는 것과 같이 리소스에서 구성한 다이얼로그가 Dockable Pane 내부에 있어 자유롭게 도킹 및 플로팅 할 수 있습니다.
이 클래스는 CGUIDialogCustom
클래스를 상속받는 클래스입니다. 따라서 다이얼로그 구성 및 이벤트 핸들러 추가 등의 기본 사항은 아래 문서를 참고하세요.
1 리소스에서 다이얼로그 만들기(MFC)
주의 사항
CGUIDialogCustom 사용법을 참고해서 리소스에서 다이얼로그를 만들 때, 아래와 같이 "제목 표시줄"은 False, "테두리"는 None으로 설정해야 합니다.
이 다이얼로그 창은 독자적으로 팝업되는 것이 아니라 다른 창 안에 자식 창으로 들어갈 것이기 때문입니다.

위와 같이 리소스 뷰의 프로퍼티 창에서 설정하거나, 또는 리소스 파일(.rc)에서 해당 다이얼로그의 DS_MODALFRAME
속성과 WS_CAPTION
속성을 제거하면 됩니다.
2 다이얼로그를 Dockable Pane 안에 추가하기
![]() |
![]() |
---|
위 그림을 보면 리소스에서 만든 다이얼로그를 자유롭게 도킹 및 플로팅 가능한 Dockable Pane 안에 넣은 것을 볼 수 있습니다. 위와 같이 Dockable Pane 안에 다이얼로그를 자식 창으로 넣는 방법을 설명하겠습니다.
2.1 다이얼로그 클래스 추가
위 다이얼로그에 연결된 MFC 클래스(CDialogBoardSize
)를 추가하고, 해당 클래스가 FLImaging::GUI::CGUIDialogCustomEmbedded
을 상속받도록 합니다.
아래는 헤더 파일입니다.
// DialogBoardSize.h
#pragma once
namespace FLImaging
{
namespace GUI
{
class CDialogBoardSize : public CGUIDialogCustomEmbedded
{
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
public:
DECLARE_MESSAGE_MAP()
afx_msg void OnBnClickedButtonApply();
};
}
}
아래는 cpp 파일입니다.
// 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, CGUIDialogCustomEmbedded)
BEGIN_MESSAGE_MAP(CDialogBoardSize, CGUIDialogCustomEmbedded)
ON_BN_CLICKED(IDC_BUTTON_APPLY, &CDialogBoardSize::OnBnClickedButtonApply)
END_MESSAGE_MAP()
CDialogBoardSize::CDialogBoardSize(CWnd* pParent /*=nullptr*/)
: CGUIDialogCustomEmbedded(IDD_DIALOG_BOARDSIZE, pParent)
{
// title setting
SetTitle(L"Board Size");
}
CDialogBoardSize::~CDialogBoardSize()
{
}
void CDialogBoardSize::DoDataExchange(CDataExchange* pDX)
{
CGUIDialogCustomEmbedded::DoDataExchange(pDX);
}
void CDialogBoardSize::OnBnClickedButtonApply()
{
CGUIMessageBox::DoModal(L"Apply button clicked");
}
2.2 Dockable Pane 생성
FLImaging::GUI::CGUIPaneDialogCustomEmbedded
클래스를 사용하여 간편하게 Embedded Custom Dialog를 감싸는 부모 pane 창을 만들 수 있습니다.
CDialogBoardSize* m_pDialogCustomEmbedded = new CDialogBoardSize();
CGUIPaneDialogCustomEmbedded* m_pPaneDialog = new CGUIPaneDialogCustomEmbedded(m_pDialogActive);
CRect rectDummy(0, 0, 400, 400);
if(!m_pPaneDialog->Create(L"", AfxGetApp()->m_pMainWnd, rectDummy, TRUE, ID_PANE_CUSTOM, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI | CBRS_FLYBY))
{
TRACE0("Couldn't create pane.\n");
}
m_pPaneDialog->UpdateFont();
if(CGUIMainFrame* pMF = CGUIManager::GetMainFrame())
pMF->AddPane(m_pPaneDialog);
위 코드를 수행하면 Dockable Pane 창이 생성되면서, 자식 창으로 전달한 CDialogBoardSize
객체의 창을 자식 창으로 생성하여 dockable pane 안에 dialog가 있는 창이 띄워집니다.
3 Dockable Pane 다이얼로그를 띄울 수 있는 메뉴 아이템 만들기
미리보기

위 그림에서 보이는 것과 같이 Menu 창에 "DIALOG_TEACHING" 이라는 메뉴 아이템이 있고, 이 메뉴 아이템을 더블 클릭하면 우측의 "DIALOG_TEACHING" 이라는 Dockable Pane 창이 뜨도록 하는 방법을 설명하겠습니다.
3.1 메뉴 등록
프로그램의 InitInstance()
함수에서 CGUIManager::PreInitialize();
를 호출한 후 아래 코드를 추가하여 다이얼로그 메뉴 아이템을 등록합니다. Dockable Pane 내부에 dialog 가 있는 창 CGUIPaneDialogCustomEmbedded
클래스에 연결된 메뉴 아이템 CGUIMenuItemPaneDialogCustomEmbedded
를 사용하여 간편하게 등록할 수 있습니다.
BOOL CTestProgramApp::InitInstance()
{
CWinAppEx::InitInstance();
SetRegistryKey(L"TestProgramApp");
CGUIManager::PreInitialize();
CGUIMenuItemPaneDialogCustomEmbedded* pMenuItem = new CGUIMenuItemPaneDialogCustomEmbedded;
pMenuItem->SetPath(L"Algorithm Manager@Imaging"); // path
pMenuItem->SetName(L"DIALOG_TEACHING"); // name of menu item
pMenuItem->SetIcon(ETreeItemIcon_License); // icon setting
pMenuItem->SetCustomDialog(new CDialogBoardSize);
CGUIManager::AddMenuItem(pMenuItem);
...
}
위와 같이 등록하면 Menu 창에 메뉴 아이템이 추가되며, 이 메뉴 아이템을 더블클릭하여 다이얼로그를 띄울 수 있습니다.