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된 녀석을 얻는 함수를 디폴트로 제공하죠

댓글 없음:

댓글 쓰기