[C++] MFC 개발

다이어로그(Dialog) 도킹(Docking)하기

개발자혜콩 2026. 6. 18. 16:24

CFormView 기반 PaneDialog구현하려고 찾아보던 중
프로젝트 생성과정에 따라서 구현의 차이가 있다는 것을 알았다.

사용자 인터페이스 기능에서 어떤 명령을 선택하느냐에 따라 갈리는데
"클래식 메뉴를 사용했을 때" 와 "메뉴 모음 및 도구 모음 사용" 두가지 경우로 구현해보고자 한다.

https://atin.tistory.com/173 를 참고하여 

쌩초보 개발자도 할 수 있게, 더 상세히 기록하고자 한다.

 


VisualStudio 2022

#1. 클래식 메뉴를 사용했을 때 DockingDialog 만들기

1.프로젝트 생성

①~② : MFC 앱 >  프로젝트 명 입력 후 프로젝트 만들기

 

 

③~④ : 응용프로그램 종류 : 단일문서, 프로젝트 스타일 : MFC 표준

 

⑤~⑥ : 사용자 인터페이스 기능 : 명령모음 - 클래식 메뉴사용

 

⑦ : 고급 기능 모두 해제하기

 

⑧~⑨ : 생성된 클래스 > VIew, 기본클래스>CFormView 선택


2. 코딩

(1) 도킹할 다이어로그 생성 (dialog1)

- Ctrl + Shift + E = 리소스 뷰 단축키

- Dialog > 우클릭 후 삽입

 

-생성한 IDD_DIALOG1 속성에서 다음 3가지 값 변경
ID : IDD_DIALOG1
Border : None
Style : Child

 


(2) 솔루션 탐색기>헤더파일>MainFrm.h : 맨 밑에 추가

- class CMainFrame : public CFrameWnd() 안에 코드추가

class CMainFrame : public CFrameWnd {

... 소스 중략 ...

//아래 코드 삽입
public:
CDialogBar m_DockingBar;

};


(3) 솔루션 탐색기>소스파일>  MainFrm.cpp 

- OnCreate() 함수 안에 코드추가

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	... 소스중략 ...

	//아래 코드 추가
	if (!m_DockingBar.Create(this, MAKEINTRESOURCE(IDD_DIALOG1),CBRS_LEFT,IDD_DIALOG1)) {
		return -1;
	}

	m_DockingBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_DockingBar);

	return 0;
}

 

 

3.실행화면


#2. 클래식 메뉴를 사용했을 때 DockingDialog 만들기

1.프로젝트 생성

프로젝트 생성 방법은 위 과정과 똑같은데 ,

명령모음 - "메뉴 모음 및 도구 모음 사용" 이것만 바꿔주기!


2. 코딩

(1) 도킹할 다이어로그 생성 (dialog1)

- Ctrl + Shift + E = 리소스 뷰 단축키

- Dialog > 우클릭 후 삽입

 

-생성한 IDD_DIALOG1 속성에서 다음 3가지 값 변경
ID : IDD_DIALOG1
Border : None
Style : Child

 

(2) 솔루션 탐색기>헤더파일>MainFrm.h : 맨 밑에 추가

- class CMainFrame : public CFrameWndEx ( ) 안에 코드추가

class CMainFrame : public CFrameWndEx
{
	...  코드 중략 ... 
    
    
	public:
	CPaneDialog m_DockingBar;
};

 

(3) 솔루션 탐색기>소스파일>  MainFrm.cpp 

- OnCreate() 함수 중간에 코드추가

 

if (!m_DockingBar.Create(_T("DialogBar"), this, TRUE, MAKEINTRESOURCE(IDD_DIALOG1),WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT|CBRS_FLOAT_MULTI,IDD_DIALOG1)) {
   return -1;
}

 

m_DockingBar.EnableDocking(CBRS_ALIGN_ANY);

DockPane(&m_DockingBar);

 

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

	...

	if (!m_wndStatusBar.Create(this)) {
 		...
	}

	//이 함수 끝 부분에 아래 코드 추가
	if (!m_DockingBar.Create(_T("DialogBar"), this, TRUE, MAKEINTRESOURCE(IDD_DIALOG1),
		WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | 
		CBRS_LEFT|CBRS_FLOAT_MULTI,IDD_DIALOG1)) {
			return -1;
	}

	// TODO: 도구 모음 및 메뉴 모음을 도킹할 수 없게 하려면 이 다섯 줄을 삭제하십시오.
	m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	m_DockingBar.EnableDocking(CBRS_ALIGN_ANY);

	EnableDocking(CBRS_ALIGN_ANY);
	DockPane(&m_wndMenuBar);
	DockPane(&m_wndToolBar);
	DockPane(&m_DockingBar);
    
    ...
}

 

(4) 다이어로그 버튼 활성화

4-1) 솔루션 탐색기에서 프로젝트 우클릭 -> [추가] -> [클래스]를 선택하여 "MyPaneDialog" 생성

 

 

4-2) 솔루션 탐색기>헤더파일> MyPaneDialog.h

#pragma once
#include <afxpanedialog.h>

class CMyPaneDialog : public CPaneDialog
{
    DECLARE_DYNAMIC(CMyPaneDialog)

public:
    CMyPaneDialog() = default;
    virtual ~CMyPaneDialog() = default;

    // 버추얼 함수를 여기에 추가.
    virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler) override
    {
        // bDisableIfNoHndler를 FALSE로 강제 지정하여 
        // 핸들러가 없어도 버튼이 자동으로 비활성화되지 않도록 합니다.
        CPaneDialog::OnUpdateCmdUI(pTarget, FALSE);
    }

protected:
    DECLARE_MESSAGE_MAP()
};

 

4-3) 솔루션 탐색기>소스파일> MyPaneDialog.cpp

// MyPaneDialog.cpp
#include "pch.h" // 프로젝트 환경에 따라 생략 가능
#include "MyPaneDialog.h"

IMPLEMENT_DYNAMIC(CMyPaneDialog, CPaneDialog)

BEGIN_MESSAGE_MAP(CMyPaneDialog, CPaneDialog)
END_MESSAGE_MAP()

 

4-4) 솔루션 탐색기>헤더파일> MainFrm.h

#include "MyPaneDialog.h" // 1. 헤더 추가


class CMainFrame : public CFrameWndEx
{
// ... 기존 코드 생략 ...

//2。함수 수정
//기존함수 public:CPaneDialog m_DockingBar;

public:
    CMyPaneDialog m_DockingBar; 
};

3.실행화면

 

 


 

'[C++] MFC 개발' 카테고리의 다른 글

MFC 애플리케이션 생성 시 종류 선택옵션  (0) 2026.06.17