Embedded Custom Dialog

개요

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

미리보기

Dialog Property
Fig. Pane Dialog

위 그림에서 보이는 것과 같이 리소스에서 구성한 다이얼로그가 Dockable Pane 내부에 있어 자유롭게 도킹 및 플로팅 할 수 있습니다.

이 클래스는 CGUIDialogCustom 클래스를 상속받는 클래스입니다. 따라서 다이얼로그 구성 및 이벤트 핸들러 추가 등의 기본 사항은 아래 문서를 참고하세요.

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

주의 사항

CGUIDialogCustom 사용법을 참고해서 리소스에서 다이얼로그를 만들 때, 아래와 같이 "제목 표시줄"은 False, "테두리"는 None으로 설정해야 합니다.

이 다이얼로그 창은 독자적으로 팝업되는 것이 아니라 다른 창 안에 자식 창으로 들어갈 것이기 때문입니다.

Dialog Property
Fig. Dialog Property

위와 같이 리소스 뷰의 프로퍼티 창에서 설정하거나, 또는 리소스 파일(.rc)에서 해당 다이얼로그의 DS_MODALFRAME 속성과 WS_CAPTION 속성을 제거하면 됩니다.

2 다이얼로그를 Dockable Pane 안에 추가하기

Default Dialog Custom Dialog
Fig. Dialog in 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 다이얼로그를 띄울 수 있는 메뉴 아이템 만들기

미리보기

Dialog Property
Fig. Pane Dialog with Menu Item

위 그림에서 보이는 것과 같이 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 창에 메뉴 아이템이 추가되며, 이 메뉴 아이템을 더블클릭하여 다이얼로그를 띄울 수 있습니다.