대화상자 기반 ESC 키 이벤트 제거

MFC를 사용해서 대화상자 기반의 프로그래밍을 작성하게 되면 뜻하지 않는 상황에 직면하게 된다. 바로 ESC 키를 누르게 되면 프로그램이 종료되는 것이다. 이 문제를 해결해 보자.

일반적으로 MFC로 작성된 프로그램을 통해 이벤트를 줄 경우 이러한 이벤트메시지들은 메시지 큐에 저장된다. 후에 메시지큐로부터 GetMessage() 함수에 의해 메시지를 꺼내와 TranslateMessage()를 통해 메시지가 KEY_DOWN인지 KEY_CHAR 또는 KEY_UP 인지를 판단하게 된다. 미리 정의되어 처리가 필요한 메시지의 경우 DispatchMessage() 함수에 의해 WinProc() 함수로 보내진다.

위 내용을 살펴보면 대화상자기반으로 작성할 경우 ESC 키에 대한 이벤트가 자동으로 OnCancel()을 부르게 될 것이라는 것을 짐작해 볼 수 있다. 따라서 ESC 키에 대한 이벤트를 미리 제거해 주면 된다. 이러한 역할은 PreTranslateMessage()  함수를 통해 수행할 수 있다.

PreTranslateMessage()는 TranslateMessage() 가 수행되기 전에 미리 수행되는 함수로서 TranslateMessage()로 전달되는 모든 메시지가 미리 통과하는 곳이다. 따라서 이 함수를 재 정의하여 ESC키 혹은 별도의 사전 처리를 위한 이벤트를 전달할 수 있을 것이다.



다음 코드를 Dlg.h 에 포함시켜 준다.
virtual BOOL  PreTranslateMessage( MSG* pMsg );

Dlg.cpp를 통해 함수를 재정의 한다.
BOOL CExtractEncryptFileInfoDlg::PreTranslateMessage( MSG* pMsg )
{
	// TODO: Add your specialized code here and/or call the base class
	if( pMsg->message == WM_KEYDOWN && ( pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE ) )
	{ 
		pMsg->wParam = NULL;
	}

	return CDialog::PreTranslateMessage( pMsg );
}

위 코드는 ESC 키뿐만 아니라 ENTER 키 이벤트에 대해서도 막게 된다. 가끔 ENTER 키에 대한 이벤트도 대화상자를 종료시키는 경우가 있기 때문이다.
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Proneer
TAG

댓글을 달아 주세요

  1. 포스팅에 저렇게 소스코드 이쁘게 보여주는거 넣으려면 어떻게 해야하나요? 이쁘군요.

    2008.09.11 17:24 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • "Tip and Tech" 메뉴를 클릭하시면
      티스토리에서 SyntaxHighlight 사용하는 법이 나와있습니다. 참고하세요_

      2008.09.16 15:31 신고 [ ADDR : EDIT/ DEL ]


티스토리 툴바