Tips2019. 10. 9. 01:14

SDI CDocument에서 CView를 얻는 일반적인 방법을 검색해보면,

dynamic_cast<CxxxView*>(dynamic_cast<CMainFrame*>(AfxGetMainWnd())->GetActiveView())

요정도 되겠다. MDI도 Child Frame이 있는 것 빼고는 비슷하다.

그런데, 이 게 사실 조금 위험할 수 있다. 위 함수 호출 시점에 실제 view가 inactive 상태로 존재할 수 있기 때문이다. 사실, 마이크로소프트에서는 위와 같이 억지로 View를 꺼내는 것보다 UpdateAllViews() 를 이용하여 느슨하게 Doc과 View를 연동하기를 원했을 것이다.

하지만 개발을 하다보면 항상 틀에 딱 맞게 구현할 수는 없는 노릇이다. 해서... 좀 더 직접적이고 확실하게 view에 접근하는 방법을 기술해본다.

 

// GetView()라는 임의의 함수를 만든다고 가정
CxxxView* CxxxDoc::GetView()
{
   if(m_viewList.IsEmpty()) return nullptr;
   return dynamic_cast<CxxxView*>((CView*)m_viewList.GetHead());
}

 

m_viewList는 CDocument가 가지고 있는 view의 리스트이다. CxxxDoc은 자식 클래스이니 당연히 접근 가능하므로, 어렵게 돌아갈 필요가 없다. 위 방법을 토대로 다양한 응용도 가능할 것이다.

 

Posted by JMAN