반응형
[ 뷰클래스의 포인터 받기 ]
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();
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 참조
CWinApp 참조
CMyProgMdiApp *pApp = (CMyProgMdiApp *) AfxGetApp( );
CMainFrame 참조
CMainFrame *pFrame = (CMainFrame *) AfxGetMainWnd( );
View에서 다른 Class 참조
// View가 포함된 도큐먼트 참조
CDocument *pDoc = (CDocument*) GetDocument();
// View가 포함된 자식 프레임 참조
CFrameWnd *pFrame = (CFrameWnd*)GetParentFrame();
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();
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();
// 경우는 뷰를 먼저 얻고 다시 뷰가 포함된 프레임을 참조 해야한다.
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);
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();
}
}
}
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 |