해결된 질문
작성
·
99
0
안녕하세요 선생님
DirectX 및 MFC로 유니티 엔진과 대략 비슷한(?) UI를 가진 게임 엔진을 만들어보고 있습니다...
아래는 제가 참고중인 유니티 엔진의 UI 구성이며,
저도 위와 얼추 비슷한 구성으로 아래와 같이 CSplitterWnd 객체 여러 개를 사용하여 메인 프레임을 여러 개로 분할하여 아래와 같이 구성만 해둔 상태입니다.
드리고 싶은 질문은 CSplitterWnd로 창을 얼추 비슷하게 분할하고 각각에 적절한 뷰를 넣은것까지는 위와 같이 완료했는데요, 다만 오른쪽 아래 빨간색으로 박스 친 영역은 어떤 뷰 객체를 띄울지 런타임에 수시로 변경이 일어나야 하는 상황입니다.
이 기능을 구현해야 하는데 필요한 폼 뷰들을 미리 생성해두고 런타임에 계속 바꿔 끼는(?) 식의 구현이 MFC 프레임워크에서 가능한 일인지, 가능하다면 대략 어떤 식으로 해야 하는지 힌트를 주실 수 있으실까요?!
혹시 책에서 다루고 계신 내용이면 제가 찾아보도록 하겠습니다!
답변 2
0
어제 라이브 방송으로 직접 설명을 드렸으나 답글로 다시 남겨드립니다. 우선 프로젝트 생성 시 Visual Studio 스타일로 생성하시고 CDockablePane을 활용해 UI를 구성하는 방식을 공부하시면 됩니다. 그렇게 하면 CSplitterWnd 클래스를 사용할 이유가 사라집니다.
그리고 폼 화면을 스위칭하는 것 역시 CDockablePane 윈도우 사용 예제를 찾아보시면 쉽게 방법을 알 수 있습니다. 참고하시기 바랍니다. 😄
0
안녕하세요, 인프런 AI 인턴입니다.
카트라이더드리프트님이 게임 엔진을 만드시는 프로젝트는 매우 흥미롭습니다. MFC에서 여러 폼 뷰를 런타임에 전환하는 기능은 가능합니다. MFC의 CSplitterWnd는 창을 여러 조각으로 나누고, 각각의 부분에 다른 뷰를 배치할 수 있게 해줍니다. 런타임에 특정 영역의 뷰를 교체하는 방법을 설명드리겠습니다.
CView 기반 클래스 사용: MFC 애플리케이션에서 여러 뷰를 사용하려면 CView 기반 클래스를 여러 개 정의합니다. 각각의 클래스를 원하는 기능에 맞게 설계하세요.
CSplitterWnd 및 RecalcLayout: CSplitterWnd의 자식 뷰를 교체하는 작업은 보통 DeleteView
를 호출하여 기존 뷰를 삭제하고 CreateView
를 사용하여 새 뷰를 만듦으로써 이루어집니다. 그런 다음, RecalcLayout
메서드를 호출하여 레이아웃을 업데이트합니다.
뷰 교체 예제 코드:
void CSampleFrame::SwitchToView(int paneNumber, CRuntimeClass* pViewClass)
{
CSplitterWnd* pSplitter = &m_wndSplitter; // CSplitterWnd 객체 참조
CView* pOldView = (CView*)pSplitter->GetPane(0, paneNumber);
if (pOldView->IsKindOf(pViewClass))
return;
int row, col;
pSplitter->GetPaneInfo(0, paneNumber, row, col);
CRect rect;
pOldView->GetWindowRect(&rect);
pSplitter->ScreenToClient(&rect);
pOldView->DestroyWindow();
pSplitter->DeleteView(0, paneNumber);
pSplitter->CreateView(0, paneNumber, pViewClass, CSize(rect.Width(), rect.Height()), nullptr);
pSplitter->RecalcLayout();
CView* pNewView = (CView*)pSplitter->GetPane(0, paneNumber);
pNewView->OnInitialUpdate();
pSplitter->SetActivePane(0, paneNumber);
}
위 코드는 특정 파네에 대해 기존의 뷰를 삭제하고 새 뷰를 생성하는 방식의 예입니다. CRuntimeClass
는 사용할 뷰의 클래스 정보를 제공하는 역할을 합니다.
관련된 MFC 기술에 대한 보다 자세한 설명은 다음의 링크에서 확인하실 수 있습니다:
- MFC에서 런타임에 뷰 전환하는 기법
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.