미니맵은 다음과 같이 여러 게임에서도 흔히 확인해 볼 수가 있다.
이전에 MFC에서 타일을 배치해보았다.
이번에는 위에 사진처럼 배치한 타일들을 띄워줄 미니맵을 만들어보려고 한다.
우선 미니맵을 띄워주기 위해 View클래스를 하나 만들어 준다.
기본 클래스는 CView로 해준다.
클래스를 생성한 다음, 생성한 클래스를 클릭하고 클래스 뷰를 누른다음 재정의를 클릭한다.
그리고 스크롤을 쭈욱 내리다 보면 OnDraw라는 함수가 보일 것이다.
클릭하여 재정의 해준다.
재정의를 하고나서 헤더파일을 가게되면 다음과 같이 나올 것이다.
OnDraw 함수까지 재정의를 완료하였으면 이제 다음과 같이 창을 분리해야 한다.
창을 분리하기 위해서 MFC에서 제공해주는 CSplitterWnd 클래스를 사용한다.
CSplitterWnd
-> 여러 개의 창이 포함된 창인 분할자 창 기능을 제공
CSplitterWnd 클래스
CSplitterWnd 클래스CSplitterWnd Class 이 문서의 내용 --> 여러 개의 창이 포함된 창인 분할자 창 기능을 제공합니다.Provides the functionality of a splitter window, which is a window that contains multiple panes. 구문Syntax cl
docs.microsoft.com
CSplitterWnd는 메인 프레임 클래스에 정의하면 된다.
창을 분리하더라도 기존의 ToolView가 사용할 창이 필요하므로,
Main Splitter와 미니맵으로 사용할 SecondSplitter 두 개를 선언한다.
그 다음 MainFrame 클래스에서 OnCreateClient라는 함수를 재정의 해준다.
함수 재정의 후에 다음과 같이 MainSplitter와 SecondSplitter를 통해서 창을 분할해주면 된다.
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
/*
0,0 0,1
1,0 1,1
*/
m_MainSplitter.CreateStatic(this, 1, 2);
m_MainSplitter.CreateView(0, 1, RUNTIME_CLASS(CMFCToolView), CSize(800 , 600 ), pContext);
m_SecondSplitter.CreateStatic(&m_MainSplitter, 2, 1, WS_VISIBLE | WS_CHILD, m_MainSplitter.IdFromRowCol(0, 0));
m_SecondSplitter.CreateView(0, 0, RUNTIME_CLASS(CMiniView), CSize(300, 300), pContext);
m_SecondSplitter.CreateView(1, 0, RUNTIME_CLASS(CMyFormView), CSize(300, 300), pContext);
m_MainSplitter.SetColumnInfo(0, 300, 10);
return TRUE;
}
분할된 창을 만들려면 CreateStatic 함수를 먼저 선언하여야 한다.
그래야지 이후에 CreateView 함수를 통해 창 분할을 시도한다.
CSplitterWnd 내부 함수는 MSDN에서 확인 해볼 수 있다.
CSplitterWnd 클래스
CSplitterWnd 클래스CSplitterWnd Class 이 문서의 내용 --> 여러 개의 창이 포함된 창인 분할자 창 기능을 제공합니다.Provides the functionality of a splitter window, which is a window that contains multiple panes. 구문Syntax cl
docs.microsoft.com
위와 같이 정의하였으면 결과는 다음과 같다.
이제 미니맵 클래스에서 OnDraw 함수 부분으로 이동하여 다음과 같이 정의하면 된다.
void CMiniView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
CGraphic_Device::Get_Instance()->Render_Begin();
// winApp -> MainFrame 얻어옴.
CMainFrame* pMain = dynamic_cast<CMainFrame*>(::AfxGetApp()->GetMainWnd());
//MainFrame -> MainSplitter -> MFCToolView를 얻어옴.
CMFCToolView* pView = dynamic_cast<CMFCToolView*>(pMain->m_MainSplitter.GetPane(0, 1));
// MFCToolView -> CTerrain 얻어옴.
CTerrain* pTerrain = pView->m_pTerrain;
pTerrain->MiniRender_Terrain();
CGraphic_Device::Get_Instance()->Render_End(m_hWnd);
}
결과
'Programming > MFC' 카테고리의 다른 글
MFC - UnitTool Part3(저장 및 불러오기) (0) | 2020.12.05 |
---|---|
MFC - UnitTool Part2(리스트에 정보 추가 및 삭제) (0) | 2020.12.05 |
MFC - UnitTool Part1(기본 구성), 이벤트 처리기 (0) | 2020.11.29 |
MFC - 기본 이론 , 계층 구조 (0) | 2020.11.29 |
MFC - 타일 픽킹(내적) (0) | 2020.11.29 |