모달리스 다이얼로그에서 ESC키와 ENTER키 무시하기 > MFC Tip

본문 바로가기
사이트 내 전체검색

MFC Tip

모달리스 다이얼로그에서 ESC키와 ENTER키 무시하기

페이지 정보

profile_image
작성자 이즈
댓글 0건 조회 1,775회 작성일 06-12-26 23:48

본문

모달리스 다이얼로그를 만들고 이 ESC,ENTER 키를 입력하면 다이얼로그가 사라지게 됩니다. 그래서 이 두키를 무시하도록 해야 다이얼로그가 사라지지 않습니다.

그래서 다음과 같이 처리해주면 되죠

위자드로 PreTranslateMessage()를 등록하고 밑의 코드를 넣어주면 됨.

BOOL C~~Dlg::PreTranslateMessage(MSG* pMsg)
{
    …….
    if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_ESCAPE)
        return TRUE;
    if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN)
        return TRUE;
    return CDialog::PreTranslateMessage(pMsg);
}

 

물론 ESC와 ENTER를 무시하는 것은 좋습니다만...

modeless 다이얼로그에서는 반드시 OnOK와 OnCancel을 오버라이드 해줘야 합니다.

왜냐하면 CDialog에서는 기본적으로 두 함수에서 EndDialog를 호출하는데 이 함수는 modal 다이얼로그를 위한 함수입니다.

modeless 다이얼로그는 DestroyWindow를 호출해야 제대로 파괴됩니다. (뭐... 계속 그 다이얼로그를 써먹으시겠다면 ShowWindow(SW_HIDE)를 사용하면 되고요.)

 그리고 ENTER키는 기본적으로 디폴트 버튼을 누르게 됩니다. 무시하는 것도 좋지만 디폴트 버튼을 적절한 것으로 바꿔주는 것도 좋은 방법입니다. 

 

이건 조금 보충설명입니다..

  생성하는 다이얼로그가 모달 다이얼로그라면 별 문제가 없겟지만 모덜리스라면 반드시 IDOK의 ID를 가진 버튼을 만들어줘야 합니다..

그래야 OnOk 함수에서 DestroyWindow를 호출해줄수 있고 PostNcDestroy 함수에서 자신의 객체를 제거해 줄수 있으니까요.. 안그러면 메모리가 줄줄 새겠죠?

 하지만 IDOK버튼을 넣고싶지 않다.. 이 다이얼로그는 버튼이 하나도 없는 다이얼로그라던지 혹은 IDOK버튼이 들어갈 자리가 없다.. 하는 경우가 있을겁니다..

 

이럴땐 조금 편법을 써야 합니다.. 위에 말씀드렸다시피 IDOK 버튼은 있어야 합니다..

이럴땐 먼저 버튼을 만드시고 IDOK로 바꿔주신다음에 대충 적당한 위치에 넣어주신후 버튼컨트롤의 Visible 속성을 없애버리시면 됩니다.. Tab Stop 속성도 없애시구요.. 탭으로 선택이 되면 안돼니까요..

그리고 나서 ESC키를 눌렀다던지 타이틀바의 X버튼을 눌렀을때 메시지를 가로채서 OnOk 함수를 실행시키시면 됩니다.. 그리고 OnOk에서 윈도우 파괴 -> 자신 제거.. 이런식으로 하시면 됩니다..

댓글목록

등록된 댓글이 없습니다.

Total 172건 1 페이지

검색

회원로그인

회원가입

사이트 정보

컴퓨터 정보,윈도우즈,리눅스,포토샵,3ds
맥스,프로그래밍 강좌팁

접속자집계

오늘
252
어제
724
최대
5,287
전체
637,251
Copyright © www.qdata.co.kr All rights reserved.