프로젝트를 수행하다가 특정 프로그램의 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 가 된다.
출처> 싸이월드 블로그
'메모 > C/C++' 카테고리의 다른 글
우선순위 큐 STL 사용법 (0) | 2012.03.22 |
---|---|
MFC 참조 (0) | 2012.03.20 |
win32 api (0) | 2012.03.19 |
Win32 디폴트 페이지 분석 (0) | 2012.03.18 |
Win32 API 에서의 문자형 데이터 (0) | 2012.03.18 |