windows mfc 다이얼로그 베이스 프로그램에서의 간단한 팁

1.jpg 

windows mfc 를 이용해  이런 간단한 프로그램을 만들던 도중 아랫쪽의 edit box 에 커서를 두었을때를 제외하고는 enter 또는 esc 키를 누르면 프로그램이 그냥 종료 되는 것을 알게 되었습니다.

이를 보고 흔히 enter 버그 / esc 버그라고 부르며, 사실 버그가 아니고 enter 또는 esc 가 눌렸을때 종료되도록 만들어 진 것입니다. 하지만 원하지 않는 동작이며, 이처럼 어이 없게 종료 되지 않도록 대처를 해 주어야 합니다.


2.jpg


->Class view 화면에서 CserialDlg 클래스를 선택 한 후 오른쪽 마우스를 눌러 Properties 를 선택 한다.

->거기서 오른쪽 그림과 같이 Overrides 를 선택 하고 아래로 쭉 내려 보면 PreTranslateMessage 함수가 나옵니다.

->옆칸을 누르면 화살표가 나오고 선택 하면 간단히 이 함수를 재정의 할 수 있습니다.

->재정의된 함수의 소스코드로 바로 이동이 되며 여기다가 아래와 같이 코드를 넣어 줍니다.


코드 시작 ------------------------------------------------------

BOOL CserialDlg::PreTranslateMessage(MSG* pMsg)

{

// TODO: Add your specialized code here and/or call the base class

if(pMsg->message == WM_KEYDOWN)

{

if(pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)

{

return TRUE;

}

}

return CDialog::PreTranslateMessage(pMsg);

}

------------------------------------------------------코드 끝

사실 원리는 간단 합니다. 윈도우 프로그램은 모두 메시지드리븐 방식 이며, 발생된 모든 메시지가 메시지 루프를 통해 처리되는데 그 메시지 루프로 전달 하는 함수가 바로 이 PreTranslateMessage 입니다. 여기서 받아들인 메시지가 키입력이고, 엔터키이거나,ESC 키이면 그냥 리턴함으로써 무시 하게 하는 방법 입니다.