이 블로그 검색

2014년 5월 28일 수요일

MFC- AfxGetMainWnd()함수 와 스레드

다른 함수와는 달리 AfxGetMainWnd()함수는 스레드와 관련이 있어 주의하여야 한다.
이함수의 내부를 보면 다음과 같이 되어 있다.
_AFXWIN_INLINE CWnd* AFXAPI AfxGetMainWnd()
{
  CWinThread* pThread = AfxGetThread();
  return pThread != NULL ? pThread->GetMainWnd() : NULL;
}
내부에서 AfxGetThread()함수를 사용하는것을 볼수가 있다.
이것은 현재 스레드의 GetMainWnd()함수를 호출한다.
이것은 다른 스레드에서 메인 윈도우의 핸들이 필요할때는 문제가 된다.
즉 다른 스레드에서 다음과 같이 AfxGetMainWnd()함수를 호출하면 메인 윈도우의 핸들을 얻을수가 없게 된다.
이럴때는
CWinApp *p = AfxGetApp();
CWnd *MainWnd = p->GetMainWnd();
형식으로 하면 해결할수 있다.

여기서 주의 할점이 있다.
어떤 다이얼로그(윈도우)를 다른 스레드로 생성을 시켰다고 하자.
이 윈도우에서 메인 윈도우로 접근할려면 어떻게 해야 할까?
위에서 사용한 방법대로 하돼..타입 캐스팅에 주의를 해야한다.
CMessengerX_ClientApp *pApp 는 CWinApp를 상속받은 클래이고,
CMainFrame *pMainFrm 은 CFrameWnd를 상속받은 클래스일때,

pApp = (CMessengerX_ClientApp *)AfxGetApp();
pMainFrm = (CMainFrame *) pApp->GetMainWnd();

다음과 같이 하면 메인 윈도우의 메인 프레임 클래스 핸들을 얻을수 있다.
이렇게 얻게 되면 다음 부터는,
CView *p = pMainFrm->GetActiveView();
CDocument *pDoc = p->GetDocument();
등으로 확장해 나갈수 있을것이다.

댓글 없음:

댓글 쓰기