1. CMyHtmlView, CMyEditView, CMyListView Class 추가
2. CMainFrame 헤더 파일에 다음과 같이 각각의 클래스 헤더 파일들 추가
// MainFrm.h : CMainFrame 클래스의 인터페이스
//
#pragma once
#include "MyEditView.h"
#include "MyHtmlView.h"
#include "MyListView.h"
class CMainFrame : public CFrameWnd
{
3. 추가한 클래스의 객체들에 대한 포인터 변수를 CMainFrame 클래스의 멤버로 등록
protected: // 컨트롤 모음이 포함된 멤버입니다.
CToolBar m_wndToolBar;
CStatusBar m_wndStatusBar;
// 생성된 메시지 맵 함수
protected:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
DECLARE_MESSAGE_MAP()
CMyHtmlView* m_pwndHtmlView;
CMyEditView* m_pwndEditView;
CMyListView* m_pwndListView;
};
4. CMainFrame 클래스의 OnCreateClient 가상 함수를 재정의하여 다음과 같이 뷰 윈도우를 new 연산을 통해 생성하는 코드를 작성
OnCreateClient() 함수를 호출하면 내부적으로 new 연산 후 CreateWindow() 함수가 호출된다.
이 과정에서 RUNTIME_CLASS 매크로가 사용되는데,
MFC에서는 이를 통해 임의로 정의되는 하위 클래스의 동적 생성을 지원한다.
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
m_pwndHtmlView = new CMyHtmlView;
m_pwndEditView = new CMyEditView;
m_pwndListView = new CMyListView;
return CFrameWnd::OnCreateClient(lpcs, pContext);
}
다만, 위 과정에서 CMyHtmlView, CMyEditView, CMyListView 클래스의 생성자는
protected에 의해서 접근이 제한되어 있기 때문에 이를 public 멤버로 수정해준다.
// CMyEditView 뷰입니다.
class CMyEditView : public CEditView
{
DECLARE_DYNCREATE(CMyEditView)
// protected 멤버를 다음과 같이 public으로 수정
public:
CMyEditView(); // 동적 만들기에 사용되는 protected 생성자입니다.
virtual ~CMyEditView();
public:
#ifdef _DEBUG
virtual void AssertValid() const;
#ifndef _WIN32_WCE
virtual void Dump(CDumpContext& dc) const;
#endif
#endif
protected:
DECLARE_MESSAGE_MAP()
};
5. CMainFrame의 헤더 파일에 다음과 같은 상수를 정의
이 상수들은 생성될 뷰 윈도우의 ID가 된다.
// MainFrm.h : CMainFrame 클래스의 인터페이스
//
#pragma once
#include "MyEditView.h"
#include "MyHtmlView.h"
#include "MyListView.h"
#define VIEWID_DEFAULT AFX_IDW_PANE_FIRST
#define VIEWID_HTML AFX_IDW_PANE_FIRST + 10
#define VIEWID_EDIT AFX_IDW_PANE_FIRST + 20
#define VIEWID_LIST AFX_IDW_PANE_FIRST + 30
6. CMainFrame Class의 OnCreateClient() 함수에 뷰 윈도우를 생성하는 코드들을 추가
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
m_pwndHtmlView = new CMyHtmlView;
m_pwndEditView = new CMyEditView;
m_pwndListView = new CMyListView;
m_pwndHtmlView->Create(NULL, NULL, WS_CHILD , CFrameWnd::rectDefault, this, VIEWID_HTML, pContext);
m_pwndEditView->Create(NULL, NULL, WS_CHILD , CFrameWnd::rectDefault, this, VIEWID_EDIT, pContext);
m_pwndListView->Create(NULL, NULL, WS_CHILD , CFrameWnd::rectDefault, this, VIEWID_LIST, pContext);
return CFrameWnd::OnCreateClient(lpcs, pContext);
}
7, CMyHtmlView Class에 OnInitialUpdate() 가상 함수를 재정의하고 다음과 같은 코드를 추가
void CMyHtmlView::OnInitialUpdate()
{
CHtmlView::OnInitialUpdate();
Navigate2(_T("C:\\"));
}
8. CMyListView Class에 WM_CREATE 메세지 핸들러 함수를 등록하고 리스트 컨트롤을 초기화하는 코드를 추가
int CMyListView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CListView::OnCreate(lpCreateStruct) == -1)
return -1;
CListCtrl& List = GetListCtrl();
List.InsertColumn(0, _T("Name"), LVCFMT_LEFT, 200);
List.InsertItem(0, _T("SwitchViewDemo"));
List.ModifyStyle(LVS_TYPEMASK, LVS_REPORT);
return 0;
}
9. CMainFrame Class에 SwitchView(int nID) 함수를 멤버로 등록하여 다음과 같은 코드를 추가
void CMainFrame::SwitchView(int nID)
{
// CFrameWnd::GetActiveView 함수.
// 현재 활성화된 뷰 윈도우의 포인터를 반환하는 기능
CView* pOldView = GetActiveView();
CView* pNewView = NULL;
switch(nID)
{
case VIEWID_HTML:
pNewView = (CView*)m_pwndHtmlView;
break;
case VIEWID_EDIT:
pNewView = (CView*)m_pwndEditView;
break;
case VIEWID_LIST:
pNewView = (CView*)m_pwndListView;
break;
}
if(pNewView)
{
if(pOldView == pNewView) return;
pOldView->ShowWindow(SW_HIDE);
pOldView->SetDlgCtrlID(nID);
// 활성화된 뷰 윈도우의 ID는 반드시 AFX_IDW_PANE_FIRST가 되어야 한다.
pNewView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
pNewView->ShowWindow(SW_SHOW);
// 특정 뷰 윈도우를 활성화된 클라이언트 뷰 윈도우로 설정하는 기능을 수행
SetActiveView(pNewView);
// CFrameWnd::RecalcLayout 함수.
// 메인프레임 윈도우와 관련된 각종 컨트롤과 클라이언트 뷰 윈도우를 적절히 재배치
RecalcLayout();
}
}
10. 다음과 같이 메뉴 리소스를 편집하고 각각의 메뉴에 대한 이벤트 처리기를 추가
11. 추가한 이벤트 처리기 함수에 다음과 같은 코드를 입력
void CMainFrame::OnSwitchviewSwitcheditview()
{
SwitchView(VIEWID_EDIT);
}
void CMainFrame::OnSwitchviewSwitchhtmlclass()
{
SwitchView(VIEWID_HTML);
}
void CMainFrame::OnSwitchviewSwitchlistview()
{
SwitchView(VIEWID_LIST);
}
'language > C|C++' 카테고리의 다른 글
문자와 문자열 처리 함수 (0) | 2016.07.25 |
---|---|
데이터 상수화, 포인터 상수화 (0) | 2016.07.21 |
디폴트 대입연산자에 의한 문제점 (0) | 2016.05.07 |
#pragma (0) | 2016.05.02 |
인라인(Inline) 함수 (0) | 2016.05.02 |