Windows SDK 비 모드 대화 상자 메시지 처리

SDK 에서 비 모드 대화 상 자 를 사용 할 때 주 순환 에 다음 코드 를 삽입 해 야 합 니 다.1. while (GetMessage(&msg,NULL,0,0) { 2. if (!IsDialogMessage(hdlg,&msg){ 3. TranslateMessage(&msg); 4. DispatchMessage(&msg); 5. } 6. }
나의 문 제 는:
왜 IsDialogMessage 를 호출 합 니까?비 모드 대화 상자 와 주 창 은 어떤 차이 가 있 습 니까?IsDialogMessage 를 호출 하지 않 으 면 대화 상자 에 메 시 지 를 전달 할 수 있 습 니까?IsDialogMessage 를 꼭 호출 해 야 한다 면,여러 개의 비 모드 대화 상자 가 있다 면,모든 비 모드 대화 상자 에 IsDialogMessage 를 단독으로 호출 해 야 합 니까?그렇다면 MFC 는 어떻게 처 리 했 을 까?MFC 가 메 인 메시지 순환 을 숨 겼 기 때문에,나 는 어떻게 IsDialogMessage 에 대한 호출 을 증가 합 니까?
이 일련의 문 제 를 고려 하려 면 먼저 IsDialogMessage 의 역할 을 알 아야 한다.이름 에 헷 갈 리 지 않도록 해 야 한다.
IsDialogMessage 는 이름 처럼 대화 상자 메 시 지 를 검사 하 는 것 이 아니 라 메 시 지 를 설명 하거나 변환 하 는 데 사 용 됩 니 다.더 적절 한 이름 은 TranslateDialogMessage 일 것 입 니 다.
TranslateAccelerator 와 비슷 합 니 다.IsDialogMessage 는 비 모드 대화 상자 메 시 지 를 설명 합 니 다.예 를 들 어 Tab 키 와 Shift+Tab 키 를 대화 상자 앞/뒤의 제어 에 매 핑 하고 화살표 키 를 대화 상자 에 매 핑 합 니 다.대화 상자 에 설 치 된 정 보 를 설명 하 는 가속 키 시트 로 볼 수 있 습 니 다.실제로 IsDialogMessage 는 대화 상자 전용 이 아 닙 니 다.-제어 되 는 모든 창 에서 대화 상자 와 같은 키보드 행동 을 할 수 있 습 니 다.그러나 첫 번 째 매개 변 수 는 대화 상자 의 HWND 이기 때문에 실제 적 으로 모든 비 모드 대화 상자 에서 이 함 수 를 호출 해 야 합 니 다.보통 대화 상 자 를 만 들 때 HWND 형식 변 수 를 가 져 옵 니 다 ghDlg。
지금 문제 1(왜 IsDialogMessage 를 호출 합 니까?)라 는 답변 도 문제 4 중 전반 부 를 동시에 해결 했다.
다음 해결 해 야 할 문 제 는 MFC 가 대화 상자 메 시 지 를 어떻게 설명 하 느 냐 하 는 것 이다.MFC 에서 복잡 한 가상 함 수 를 사 용 했 습 니 다:CW nd:PreTranslateMessage,이 가상 함 수 는 모든 창 메 시 지 를 주 메시지 순환 에 들 어가 게 합 니 다.창 자체 의 순환 을 수정 하지 않 아 도 됩 니 다.다음은 CDialog::PreTranslateMessage 의 부족 한 구현 코드 입 니 다.1. BOOL   CDialog::PreTranslateMessage(MSG* pMsg) 2. { 3. ...... 4. // many lines of intimidating code 5. ...... 6. return   PreTranslateInput(pMsg); 7. }
다시 말 하면 CDialog 는 또 다른 가상 함수 로 메 시 지 를 전달 합 니 다:CW nd::PreTranslateInput1. BOOL   CWnd::PreTranslateInput(LPMSG lpMsg) 2. { 3. if   ( /* keyboard or mouse message */ ) 4. { 5. return   IsDialogMessage(lpMsg); 6. } 7. return   FALSE; 8. }
CWnd::IsDialogMessage 는 실제로 mhwnd 는 HWND 매개 변수 로 전 과정 을 호출 합 니 다:IsDialogMessage 의 포장 함수 입 니 다.이 로 인해 MFC 의 모든 대화 상자 가 자신의 입력 을 설명 하 게 되 었 다.다섯 개의 대화 상 자 를 동시에 실행 하면 모든 대화 상자 의 PreTranslateMessage 는 IsDialogMessage 를 호출 합 니 다.-그 러 니까 아무것도 할 필요 가 없습니다.MFC 는 정말 대단 하 다.너 는 전혀 신경 쓸 필요 가 없다.IsDialogMessage 는 스스로 잘 돌아 갈 것 이다.

좋은 웹페이지 즐겨찾기