레이블이 AfxGetApp인 게시물을 표시합니다. 모든 게시물 표시
레이블이 AfxGetApp인 게시물을 표시합니다. 모든 게시물 표시

2010년 4월 27일 화요일

AfxGetApp() 와 AfxGetMainWnd()의 차이점

exe 파일을 클릭하는 순간 하나의 프로세스가 동작하게 됩니다.

 프로그램당 하나의 프로세스가 시작이 되는 것이며..
 
 최초로 하는 짓은 프로세스의 진입점을 찾는 것입니다.

 즉 main 함수를 찾으며.. mfc에서는 winmain을 참조하게 되겠지요..

 그렇게 되면서 최초에 프로세스가 하나의 쓰레드를 참조하게 되는데..
 
 님이 생성하신 CXXXApp 입니다.

 이녀석의 상속 구조를 보면 CWinApp로 부터 상속했으며..
 
 또 CWinApp는 다음과 같이 선언된것을 볼수 있습니다.

 class CWinApp : public CWinThread

 즉 쓰레드에서 상속받은 것입니다.

 하나의 프로세스에서는 여러개의 쓰레드를 생성 시킬수 있는데..
 
 바로 app라는 의미는 이렇게 생성시킨 쓰레드를 의미합니다.

 그렇다면.. AfxGetApp()의 의미는 가장 먼저 생성시킨 app를 반환한다라는 의미이죠..

 즉 님이 최초 생성시킨.. CXXXApp의 포인터가 반환되는 것입니다.

 따라서 CXXXApp * pApp = (CXXXApp*)AfxGetApp(); // 형변환을 해야 하는 이유는 아시겠죠??

 

 이렇게 생성시킨 쓰레드에 가장 중심이 되는 윈도우를 생성 시키고 등록 시킵니다.

 app에 있는

 BOOL CXXXApp::InitInstance()
 {
  ...
  CMainFrame* pMainFrame = new CMainFrame;
  if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
   return FALSE;

     m_pMainWnd = pMainFrame; // 이렇게 설정하는 과정이 현 쓰레드에 MainWnd를 설정하는 과정입니다.
  ....
 }
 만일 다이얼로그 베이스면
 m_pMainWnd = dlg;
 이렇게 다이얼로그를 메인 윈도우로 등록시키겠지요..

 afx라는 접두어를 주목하세요..
 mfc에서는 모든 전역 자원에는 afx라는 접두어를 붙였습니다.
 이는 모든 위치에서 이 전역자원을 쉽게 콜 할수 있으며..
 님이 가장 중심이 되는 쓰레드나 메인 윈도우를 부를때.. 쉽게 사용 가능합니다.


 따라서 님이 어느 장소에서나

 CMainFrame * pMain = (CMainFrame *)AfxGetMainWnd();
 이렇게 사용함으로서 쉽게 메인 윈도우를 부를수 있습니다.

 

 

 결국.. 모든 프로그램은 하나의 프로세스로 부터 기본이 되는 쓰레드가 존재하며..
 mfc에서 그 중심 쓰레드는 CWinApp에서 관리하게 되고..
 그 쓰레드에서 창을 생성하여...
 가장 기본이 되는 창을 그 쓰레드에 메인 윈도우로 설정하는 과정에 대해서
 이해를 하신다면 쉽게 해결되는 문제입니다.


 메인윈도우가 생성된뒤.. SDI 구조의 경우 또다시
 여러개의 차일드 프레임과 여러개으 뷰, 그리고 도큐먼트등을 둘수 있습니다.

 이들은 한개가 아니기 때문에 Active된 녀석을 얻는 함수를 디폴트로 제공하죠

AfxGetApp()

MFC Programming을 하다 보면 Dialog나 임의의 클래스 에서 Main Frame 이나 View Class의 Method를 사용하여야 할 경우가 있다. 이러한 경우 AfxGetApp() 라는 API가 유용하게 쓰인다.

 

즉, (CMainFrame *)AfxGetApp()->m_pMainWnd) 를 하게 되면 임의의 클래스 에서 Main Frame의 Member 및 Method의 접근을 할 수 있다.

 

또한 Main Frame에서 View나 Document를 접근하는 경우에는 아래와 같이 쉽게 할 수 있다.

 

CMainFrame *pFrame;

pFrame = AfxGetApp()->m_pMainWnd;

CSDIView *pView;

pView = pFrame->GetActiveView;

 

CSDIDoc *pDoc;

pDoc = pView->GetDocument();

 

이처럼 MFC를 사용하여 동등 Level의 클래스에 접근하는 방법은 우선 Application의 Class에 접근한 후 Application의 Main Frame, View로 접근 하면 된다.