MFC 에서 임의의 클래스의 포인터 얻기
Ⅰ 일반적인 SDI 프로그램에서.1.애플리케이션 클래스의 포인터를 얻을 때CWinApp* AfxGetApp()
2. 메인 프레임 클래스의 포인터를 얻을 때CWnd* AfxGetMainWnd()Exam) CTestApp *pApp = (CTestApp *)AfxGetApp();CMainFrame *pFr = (CMainFrame *)AfxGetMainWnd();이 외에 뷰 클래스에서 그 뷰를 둘러싸고 있는 프레임 윈도우를 참조할 때는CFrameWnd* GetParentFrame() constCf. GetParentFrame() 함수는 CWnd() 클래스의 멤버함수Cf. 이 함수와 AfxGetMainWnd() 함수는 SDI에서는 같은 기능을 하지만, MDI에서는 메인 프레임 윈도우와 뷰를 둘러싸고 있는 프레임 윈도우가 다르기 때문에 그 각각을 구하는 역할
3. 도큐먼트 클래스의 포인터를 얻을 때는 몇 가지 경우가 있습니다.(a) 뷰 클래스에서 도큐먼트 클래스에 접근할 때.GetDocument()(b) 임의의 클래스에서 도큐먼트 클래스에 접근할 때.CMainFrame *pFr = (CMainFrame *)AfxGetMainWnd();CTestDoc *pDoc = (CTestDoc *)pFr->GetActiveDocument();위와 같이 두 줄에 걸쳐 써도 되고 다음처럼 한 줄로 줄여써도 됩니다.CTestDoc *pDoc = (CTestDoc *) ((CMainFrame *)AfxGetMainWnd())->GetActiveDocument();
4. 뷰 클래스의 포인터를 얻을 경우.(a) 임의의 클래스에서 뷰 클래스에 접근할 때CTestView *pView = (CTestView *) ((CMainWnd *)AfxGetMainWnd())->GetActiveView();(b) 도큐먼트 클래스에서 뷰 클래스에 접근을 할 때POSITION pos = GetFirstViewPosition();while(pos != NULL) {CView *pView = GetNextView(pos);pView->UpdateWindow();}다른 방법 : UpdateAllViews(NULL) NULL 대신, 신호를 보내는 뷰의 포인터를 넣어주면 신호를 보내는 뷰는 빼고 나머지 뷰만 업데이트를 합니다.도큐먼트에 뷰가 오직 하나만 연결되어 있는 경우void CTestDoc::OnRepaintViews(){CView *pView = m_viewList.GetHead();pView->UpdateWindows();}
(c) 스플리트 윈도우에서의 각 뷰 클래스에 접근할 때- 정적 스플리트 윈도우라면 각 페인마다 다른 뷰를 사용할 수 있으므로 각 페인별로 뷰의 인스턴스 포인터를 얻어야 한다.CSplitterWnd 클래스의 변수인 m_wndSplitter 의 멤버함수 GetPane()을 사용하면 각 페인의 뷰에 접근할 수 있습니다.CWnd* GetPane( int row, int col );임의의 클래스에서 다음과 같이 사용하면 페인에 연결된 뷰의 포인터를 얻을 수 있습니다.CTestView *pView = (CTestView *)((CMainFrame *)AfxGetMainWnd())->m_wndSplitter.GetPane(0,1);Ⅱ 일반적인 MDI 프로그램에서.1. 애플리케이션 클래스의 포인터를 얻을 때CWinApp* AfxGetApp()CTestApp *pApp = (CTestApp *)AfxGetApp(); 2. CMDIFrameWnd의 파생클래스인 메인 프레임 클래스의 포인터를 얻을 때CWnd* AfxGetMainWnd()CMainFrame *pFr = (CMainFrame *)AfxGetMainWnd();3. CMDIChildWnd의 파생클래스인 자식 프레임 윈도우의 포인터를 얻을 때(a) 활성화된 자식 프레임 윈도우의 포인터를 얻을 때virtual CFrameWnd* GetActiveFrame( );cf. 애플리케이션이 SDI이거나 MDI 프레임 윈도우에 활성화된 도큐먼트가 없을 때, 리턴값은 묵시적인 this 포인터가 된다CMDIChildWnd* pChild = (CMDIChildWnd *)AfxGetMainWnd()->GetActiveFrame();
//각각 헤더파일 include#include "MainFrm.h" //메인프레임 헤더파일#include "ClassDoc.h" //Doc클래스 헤더파일#include "ClassView.h" //View를 include 할때는 반드시 Doc 헤더파일이 위에잇어야한다#include "Class.h" //APP Class 의 헤더파일 //App 클래스CMainFrame *pMain=(CMainFrame *)AfxGetMainWnd(); //App -> MainFrmCClassView *pView=(CClassView *)pMain->GetActiveView(); //App -> MainFrm -> ViewCClassDoc *pDoc=(CClassDoc *)pMain->GetActiveDocument(); //App -> MainFrm -> Doc //뷰클래스 void CClassView::OnMenuView()CClassApp *pApp=(CClassApp *)AfxGetApp(); //View -> AppCMainFrame *pMain=(CMainFrame *)AfxGetMainWnd(); //View -> MainFrmCClassDoc *pDoc=(CClassDoc *)pMain->GetActiveDocument();//View -> MainFrm -> DocCClassDoc *pDoc=(CClassDoc *)GetDocument(); //View -> Doc
//MainFrame 클래스CClassView *pView=(CClassView *)GetActiveView(); //MainFrm -> ViewCClassDoc *pDoc=(CClassDoc *)GetActiveDocument(); //MainFrm -> DocCClassApp *pApp=(CClassApp *)AfxGetApp(); //MainFrm -> App
//Doc 클래스CClassApp *pApp=(CClassApp *)AfxGetApp(); //Doc -> AppCMainFrame *pMain=(CMainFrame *)AfxGetMainWnd(); //Doc -> MainFrmCClassView *pView=(CClassView *)pMain->GetActiveView(); // Doc -> MainFrm -> ViewCClassView *pView=(CClassView *)m_viewList.GetHead(); // Doc -> View
'C & C++ > C & C++' 카테고리의 다른 글
CMap 템플릿 클래스 사용하기 (0) | 2013.05.24 |
---|---|
CString 특정문자 갯수 구하기 (0) | 2013.02.22 |
시간 연산 관련 함수 모음 (0) | 2012.11.28 |
CFileFind 사용법 (0) | 2012.08.22 |
GetLogicalDriveStrings() 현재 연결된 드라이브 이름 알아오기 (0) | 2012.08.21 |
댓글