임의의 클래스의 포인터 얻기
앞에서 SDI에서 각 클래스의 포인터를 얻는 것은 해 보았습니다. 이번엔 MDI에서 이런 작업을 해 보도록 하죠.
먼저 SDI에서의 작업을 참조하시기 바랍니다. SDI와 MDI는 관련되는 부분이 많으니까요.
![]()
일반적인 MDI 프로그램에서.
1.애플리케이션 클래스의 포인터를 얻을 때
CWinApp* AfxGetApp()
함수를 사용합니다. 이것은 SDI에서와 동일합니다. App 클래스는 MDI든 SDI든 프로그램 내에서는 하나뿐이니까요. 다음처럼 사용하면 pApp는 애플리케이션 클래스의 인스턴스 포인터를 가리키게 됩니다.
CTestApp *pApp = (CTestApp *)AfxGetApp();
2. CMDIFrameWnd의 파생클래스인 메인 프레임 클래스의 포인터를 얻을 때
CWnd* AfxGetMainWnd()
함수를 사용합니다. 사용법은 SDI에서와 동일합니다.
CMainFrame *pFr = (CMainFrame *)AfxGetMainWnd();
이렇게 써준 다음에는 pFr은 메인 프레임 클래스의 인스턴스 포인터를 가리키게 됩니다.
3. CMDIChildWnd의 파생클래스인 자식 프레임 윈도우의 포인터를 얻을 때
(a) 활성화된 자식 프레임 윈도우의 포인터를 얻을 때
virtual CFrameWnd* GetActiveFrame( );
함수를 사용합니다. MSDN에 실려있는 이 함수의 리턴값에 대한 설명을 보면, 애플리케이션이 SDI이거나 MDI 프레임 윈도우에 활성화된 도큐먼트가 없을 때, 리턴값은 묵시적인 this 포인터가 된다고 하네요.
사용법은 다음과 같습니다.
CMDIChildWnd* pChild = (CMDIChildWnd *)AfxGetMainWnd()->GetActiveFrame();
4. 뷰 / 도큐먼트 클래스의 포인터를 얻을 때
SDI에서 구한 것과 마찬가지 방법을 사용한다. SDI에서는 메인 프레임의 포인터를 얻어 GetActiveView() 또는 GetActiveDocument() 함수를 사용했지만, MDI에서는 차일드 프레임의 포인터를 얻어 거기서 GetActiveView() / GetActiveDocument() 함수를 사용하면 된다. 사용법은 거의 동일하다.
MDI에서도 SDI와 마찬가지로 도큐먼트나 뷰가 여러 개가 연결될 수 있으므로 그점만 주의해 주면 된다.
사용법은 다음과 같다.
CMDIChildWnd* pChild = (CMDIChildWnd *)AfxGetMainWnd()->GetActiveFrame();
// 뷰 클래스의 포인터 얻기
CTestView *pView = (CTestView *)pChild->GetActiveView();
// 도큐먼트 클래스의 포인터 얻기
CTestDoc *pDoc = (CTestDoc *)pChild->GetActiveDocument();
- the end of this article -