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 |
|---|