2009년 11월 5일 목요일

HWND와 CWnd의 차이

프로젝트를 수행하다가.. 특정 프로그램의 HWND를 얻어왔는데,

 

CImage class를 사용하기 위해 CWnd로 변환해야 해서 어떻게 해야하나..검색한 결과!

 

 

1.함수에서 CWnd 가 필요한데 HWND밖에 없을 때

    CWnd* pWnd = CWnd::FromHandle(HWND);

2.HWND가 필요한데 CWnd 밖에 없을때

   HWND hWnd  =  pWnd->m_hWnd;

 

이런 방법이 있었군요..!  ^-^

 

 

 

그럼..HWND와 CWnd의 차이를 알아보도록 하겠습니다.

 

 

HWND는 윈도우의 핸들을 말합니다.

파일을 다룰때 핸들이란걸 쓰잖아요?? 같은 개념으로 보시면 됩니다.
파일에 접근하려면 파일 핸들을 이용하듯이 윈도우도 역시 HWND라는 핸들을 사용하여 접근합니다.

HWND의 값은 숫자인데요..

이 윈도우의 번호가 몇 번이다 라는 걸 알고 있어야 운영체제에서 관리를 할 수 있겠죠?

이렇게 관리하기 위해  HWND, 핸들을 뜻합니다.

윈도우는 공통적으로 메세지 큐를 가집니다. 윈도우즈 프로그래밍은 기본적으로 메세지 처리 방식이기 때문입니다. 즉 메세지 큐를 가지는 것은 전부 윈도우라 보시면 됩니다. 메세지 큐라는 것은 윈도우즈에서 발생하거나 넘겨준 메세지를 저장하고 있는 곳인데 이 메세지큐에 저장된 메세지 들이 해당 윈도우로 흘러 들어가서 처리하는 것이 윈도우즈 프로그래밍의 기본 원리이입니다.

대화상자에는 여러가지 컨트롤 들이 있는데 예를 들면 버튼이나 에디트 창 같은것을 예로 들면 대화상자 역시 메세지 큐를 가지는 윈도우고 버튼, 에디트 창 역시 메세지 큐를 가지고 있는 윈도우 입니다. 따라서 버튼이나 에디트 창에 메세지를 넘기거나 메세지를 받아 처리 할 수 있습니다. 윈도우 핸들을 이러한 윈도우를 제어할 때 쓰는 이름표라고 생각하시면 됩니다.

CWnd는 MFC 클래스인데, 윈도우의 거의 모든 API 함수들을 몽땅 집어넣은 클래스 입니다. 이 클래스 안에는 멤버 변수로 윈도우 핸들을 가지고 있어서 CWnd로 파생받은 모든 클래스들은 윈도우로 볼 수 있습니다. 잘 보심 버튼이나 에디트, 대화상자 들이 모두 CWnd를 파생받은 걸 볼 수 있습니다.

가끔  함수중에 CWnd의 포인터형을 요구하거나 반환하는 함수가 있는데 이는 실제로는 CWnd가 윈도우는 아니지만 내부에 윈도우 핸들을 멤버 변수로 가지고 있기 때문에 실제 동작에선 CWnd안에 있는 윈도우 핸들을 가지고 작업하는거죠. CWnd 클래스는 이렇게 윈도우 핸들을 멤버 변수로 가지면서 특정 기능을 수행하는 윈도우를 관리하게 됩니다. 따라서 API 함수중에 CWnd형의 객체를 반환하는 함수는 없습니다.

만약 예를 들어, 대화상자의 윈도우 핸들을 얻고 싶다면 여러 방법이 있는데, 대화상자는 CDialog의 객체거나 이를 파생한 클래스의 객체겠죠. 그런데 CDialog는 CWnd를 파생 받았으니까 내부에 윈도우 핸들을 멤버변수로 가지고 있겠죠. 그게 CWnd::m_hWnd 입니다.

댓글 없음:

댓글 쓰기