MFC를 이용해 여러 개의 다이얼로그를 가지는 프로그램을 만들 때
한쪽 다이얼로그에서 다른 어떤 다이얼로그로 메세지를 날려줘야할 상황이 생기면 유용한
팁입니다. 특히나 메세지를 받는 쪽 다이얼로그가 캡션이 없는 다이얼로그고 클래스 네임을 이용해서 핸들을 얻어야 할 때 말이죠.
SendMessage를 이용해서 특정 다이얼로그로 이벤트를 날릴려면 먼저 FindWindow함수를 이용해서 받는 쪽 다이얼로그의 핸들을 얻어와야겠죠.
FindWindow( LPCTSTR lpszClassName, LPCTSTR lpszWindowName );
FindWindow함수의 원형은 위와 같습니다. 앞 쪽의 인자가 클래스 네임이 되고, 뒤 쪽의 인자가 윈도우의 캡션입니다. 하지만 위에서 말씀드렸다시피 다이얼로그의 캡션이 없기 때문에 클래스 네임을 이용해서 찾아야겠지요. 하지만 Visuak Studio의 Spy++를 이용해서 클래스 네임을 찾아보면 아래와 같이 나옵니다. 아마 다이얼로그 기반으로 만들면 모두 저런 식으로 나올겁니다.
#32770은 CDialog의 상속을 받아 만들어진 다이얼로그의 기본 클래스 네임입니다. 저런 클래스 네임으로는 정확한 핸들을 얻을 수 없습니다.
하지만 강제적으로 다이얼로그의 클래스 네임을 바꿔서 사용하면 정확한 핸들을 얻을 수 있게 되겠죠. 강제적으로 클래스 네임을 바꾸는 방법은 아래와 같습니다.
1. 프로젝트에 삽입한 다이얼로그를 클래스로 추가합니다.
저는 CCaliibDlg라는 이름의 클래스로 추가하였습니다.
그림이 조잡하지만 어쩌겠습니까...ㅡㅡ;;
2. 해당 프로젝트 폴더 내의 .rc 확장자의 리소스 파일을 메모장으로 열어서 다음과 같이 CLASS 속성을 추가하고 클래스 네임으로 사용할 이름을 넣어줍니다.
3. 다음으로 해당 다이얼로그 클래스의 생성자에 다음과 같은 코드를 추가합니다.
4. 컴파일 후 실행을 시키고 Spy++로 찍어보면~
위의 그림처럼 클래스 네임이 나오게 됩니다. 그럼 저 클래스 네임을 이용해서 핸들을 얻어 사용하면 되겠죠.
한쪽 다이얼로그에서 다른 어떤 다이얼로그로 메세지를 날려줘야할 상황이 생기면 유용한
팁입니다. 특히나 메세지를 받는 쪽 다이얼로그가 캡션이 없는 다이얼로그고 클래스 네임을 이용해서 핸들을 얻어야 할 때 말이죠.
SendMessage를 이용해서 특정 다이얼로그로 이벤트를 날릴려면 먼저 FindWindow함수를 이용해서 받는 쪽 다이얼로그의 핸들을 얻어와야겠죠.
FindWindow( LPCTSTR lpszClassName, LPCTSTR lpszWindowName );
FindWindow함수의 원형은 위와 같습니다. 앞 쪽의 인자가 클래스 네임이 되고, 뒤 쪽의 인자가 윈도우의 캡션입니다. 하지만 위에서 말씀드렸다시피 다이얼로그의 캡션이 없기 때문에 클래스 네임을 이용해서 찾아야겠지요. 하지만 Visuak Studio의 Spy++를 이용해서 클래스 네임을 찾아보면 아래와 같이 나옵니다. 아마 다이얼로그 기반으로 만들면 모두 저런 식으로 나올겁니다.
#32770은 CDialog의 상속을 받아 만들어진 다이얼로그의 기본 클래스 네임입니다. 저런 클래스 네임으로는 정확한 핸들을 얻을 수 없습니다.
하지만 강제적으로 다이얼로그의 클래스 네임을 바꿔서 사용하면 정확한 핸들을 얻을 수 있게 되겠죠. 강제적으로 클래스 네임을 바꾸는 방법은 아래와 같습니다.
1. 프로젝트에 삽입한 다이얼로그를 클래스로 추가합니다.
저는 CCaliibDlg라는 이름의 클래스로 추가하였습니다.
그림이 조잡하지만 어쩌겠습니까...ㅡㅡ;;
2. 해당 프로젝트 폴더 내의 .rc 확장자의 리소스 파일을 메모장으로 열어서 다음과 같이 CLASS 속성을 추가하고 클래스 네임으로 사용할 이름을 넣어줍니다.
3. 다음으로 해당 다이얼로그 클래스의 생성자에 다음과 같은 코드를 추가합니다.
4. 컴파일 후 실행을 시키고 Spy++로 찍어보면~
위의 그림처럼 클래스 네임이 나오게 됩니다. 그럼 저 클래스 네임을 이용해서 핸들을 얻어 사용하면 되겠죠.