티스토리 뷰


HWNDCWnd의 차이

 

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

파일에 접근하려면 파일 핸들을 이용하듯이 윈도우도 역시 HWND라는 핸들을 사용하여 접근해야 하는데 HWND의 값은 숫자로 이루어져 있다.

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

관리를 위한 id를 식별하기 위하여 HWND가 필요하다.

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

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

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

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

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

//=========================================================================//

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

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

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

HWND hWnd = pWnd->m_hWnd;

 


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함