본문 바로가기
나머지/IT개발.잡다한것.

MFC 뷰영역 가져오기

by 무늬만학생 2012. 10. 17.
반응형

[ 뷰클래스의 포인터 받기 ]
1) SDI의 경우
CMainFrame *pMainFrame = (CMainFrame *)AfxGetMainWnd();
CTempView *pView = (CTempView *)pMainFrame->GetActiveView();

2) MDI의 경우
CMainFrame *pMainFrame = (CMainFrame *)AfxGetMainWnd();
CChildFrame *pChild = (CChildFrame *)pMainFrame->GetActiveFrame();
CTempView *pView = (CTempView *)pChild->GetActiveView();

---------------------------------------------------------------------------
결국 출발점은 AfxGetMainWnd()함수입니다. 그런데, AfxGetMainWnd() 함수는
메인 스레드가 아닌 곳에서 호출하면 메인 프레임의 포인터를 리턴하지는 않습니다.
다른 스레드에서 메인 프레임에 접근해야 한다면 인자로 잘 넘기거나
AfxGetApp()->m_pMainWnd 를 사용해야 합니다.


다시 정리하면..


== SDI의 경우 ===

어플리케이션 클래스
1) CXXXXApp *pAPP = (CXXXXApp *)AfxGetApp();

메인플레임 클래스 얻기
1) CMainFrame *pMainFrame =(CMainFrame*) AfxGetApp()->m_pMainWnd;

View클래스 얻기
1) 메인플레임 클래스를 먼저 얻음.
2) CXXXXView *pView = (CXXXXView *)pMainFrame->GetActiveView();

Document 클래스 얻기
1) 메인플레임 클래스를 먼저 얻음.
2) CXXXXDoc *pDoc = (CXXXXDoc *)pMainFrame->GetActiveDocument();


== MDI의 경우 ===

차일드플레임 클래스 얻기
1) 메인플레임 클래스를 먼저 얻음.
2) CChildFrame *pChild = (CChildFrame *)pMainFrame->GetActiveFrame();

View클래스 얻기
1) 메인플레임 클래스를 먼저 얻음.
2) 차일드프래임 클래스를 얻음
3) CXXXXView *pView = (CXXXXView *)pChild->GetActiveView();

Document 클래스 얻기
1) 메인플레임 클래스를 먼저 얻음.
2) 차일드프래임 클래스를 얻음
3) CXXXXDoc *pDoc = (CXXXXDoc *)pChild->GetActiveDocument();
 
MDI Class별 참조 방법

CWinApp 참조
CMyProgMdiApp *pApp = (CMyProgMdiApp *) AfxGetApp( );

CMainFrame 참조
CMainFrame *pFrame = (CMainFrame *) AfxGetMainWnd( );

View에서 다른 Class 참조
// View가 포함된 도큐먼트 참조
CDocument *pDoc = (CDocument*) GetDocument();

// View가 포함된 자식 프레임 참조
CFrameWnd *pFrame = (CFrameWnd*)GetParentFrame();

Document에 포함된 View 참조
// GetFirstViewPosition() & GetNextView(pos) 이용
POSITION pos = GetFirstViewPosition();
Cview *pView = GetNextView(pos);

// CDocment의 멤버 변수 m_viewList 이용
// M_viewList : CDocment Class의 View 포인터를 저장하는 멤버 변수

CView *pView = m_viewList.GetHead();

Document가 포함된 Frame 참조
// 단일 원도우 경우 AfxGetMainFrame()를사용하면 되지만 다중 도큐먼트일
// 경우는 뷰를 먼저 얻고 다시 뷰가 포함된 프레임을 참조 해야한다.

CFrameWnd *pFrame = (CFrameWnd*) GetNextView(pos)->GetParentFrame();

Frame 원도우에 포함된 Active View 참조
CView *pView = GetActiveView();

Frame 원도우에 포함된 Active Document 참조
CDocument *pDoc = GetActiveDocument();

프레임 원도우 참조
// 다큐먼트 템플릿 참조(CWinApp)
POSITION pos = GetFirstDocTemplatePosition();
CDocTemplate *pDoctemplate = GetNextTemplate(pos);

// 도규먼트 참조(CDocTemplate)
POSITION pos = GetFirstDocPosition();
CDocument *pDoc = GetNextDoc(pos);

// 뷰 참조(CDocument)
POSITION pos = GetFirstViewPosition();
CDocument *pView = GetNextView(pos);

프로그램 예
CWinApp *pApp =AfxGetApp();
POSITION posTemplate =pApp->GetFirstTemplatePosition();
While(posTemplate) {
   CDocTemplate *pTemplate = pApp->GetFirstDocTemplate (posTemplate);
   POSITION posDoc = pTemplate->GetFirstDocPosition();
   while(posDoc) {
     Cdocument *pDoc = pTemplate->GetNextDoc(posDoc);
     POSTION posView = pDoc->GetFirstViewPosition();
     while(posView) {
        Cview *pView = pDoc->GetNextView(posView);
        pView->Invalidate();
     }
   }
}


반응형

'나머지 > IT개발.잡다한것.' 카테고리의 다른 글

[MFC,윈도우 프로그래밍] 핸들 얻기 (HWND hWnd)  (0) 2012.10.19
AssertValid()에 대해..  (0) 2012.10.19
MFC CImage  (0) 2012.10.12
MFC String에 숫자 INT 넣는방법  (0) 2012.10.12
MFC 예제 sample @ MSDN  (0) 2012.10.11