이 두 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버튼이 더 적당한듯하다.
'C & C++ > MFC 컨트롤' 카테고리의 다른 글
[Web] 웹 브라우저 ActiveX 삽입 (0) | 2011.03.27 |
---|---|
[ComboBox] 콤보박스 컨트롤 (0) | 2011.02.14 |
[Dialog] 대화상자 실행방법 (0) | 2011.02.11 |
[Dialog] Modeless Dialog(모달리스/모델리스 대화상자) (0) | 2011.02.11 |
[Etc] MFC 프로그램 중복방지 (0) | 2011.02.11 |
댓글