본문 바로가기
C & C++/MFC 컨트롤

[Dialog] Dialog의 IDOK, IDCANCEL의 BN_CLICKED메시지

by izen8 2011. 2. 11.
반응형

이 두 ID는 (IDOK, IDCANCEL) 의 BN_CLICK메시지는 MFC에 의해 정의 되어있어서 사용시 주의를 요한다.

 

특정메뉴를 눌렀을때 나타나는 메시지 박스의 ok버튼을 눌렀을때 발생하는 메시지 처리함수의

형태는 아래와 같고, 이 클래스는 CDialog클래스로 부터 상속받은것이다. 

void CDialogone::OnOK() {   CDialog::OnOK(); }

 

일반적인 메시지들의 메시지를 처리하는 함수는 클래스 위저드로 메시지 생성시 3가지 장소에 소스가 추가되지만, 이 두 ID는 cpp파일의 message_map 부분에

ON_BN_CLICKED(IDOK, OnOk)

와 같은 메시지처리펑션지정하는부분이 나타나지 않는다. 미리 가지고 있기 때문이다.

 

일반적인 사용에서는 문제가 되지 않지만. 만약 form을 다이얼로그에 사용하지 않고, 폼뷰 등에 사용하게 되면 문제가 발생한다.

 

class Ctest2View : public CFormView   <<--header 부분

 .......................

};

void Ctest2View::OnOk()  <<---source 부분
{
  AfxMessageBox("테스트메시지"); 
}

 

문제는 IDOK 버튼을 클릭해도 OnOK()메시지 처리함수부분으로 들어오지않는다는것이다.

이문제를 해결하기 위해서는 cpp파일의 message_map 부분에

ON_BN_CLICKED(IDOK, OnOk)메시지를 추가하면 된다.

또는 ok버튼의 ID를 바꿔도 될것이다.

발생이유는 이것이 일반적 CDialog에서 상속받지 않은 CFormView에서 상속받았기 때문인듯하다.CDialog에서 상속받은 폼에서 ok버튼의 일반적 역할은 창을 닫는것이고

CFormView에서 상속받은 폼에서 ok버튼의 역할은 ?  OK버튼이 없는것이 정답일것이다. OK보다는 Apply버튼이나 Cancel버튼이 더 적당한듯하다.

반응형

댓글