원인은 Dailog에서 Enter나 ESC가 눌리면 Event를 찾다가 구현이 없으면
부모인 CDialog의 SetDefID 함수를 부르는데 여기에 IDOK가 구현 되어 있어서 그런 거임..
이걸 방지 하자면 무식하게 VK_ENTER등으로 Key press를 막는 방법도 있지만.
좀더 우아 하게 원인을 찾아 해결 하고자 하면 아래와 같이
부모의 SetDefID를 내가 구현해 버리면 되는거다..
아래는 인터넷에서 찾아낸 원인과 해결 방법
When the user presses Enter key in a dialog two things can happen:
- The dialog has a default control (see
CDialog::SetDefID()
). Then a WM_COMMAND with the ID of this control is sent to the dialog. - The dialog does not have a default control. Then WM_COMMAND with ID = IDOK is sent to the dialog.
With the first option, it may happen that the default control has a ID equal to IDOK. Then the results will be the same that in the second option.
By default, class CDialog
has a handler for the WM_COMMAND(IDOK)
that is to call to CDialog::OnOk()
, that is a virtual function, and by default it calls EndDialog(IDOK)
that closes the dialog.
So, if you want to avoid the dialog being closed, do one of the following.
ON_MESSAGE(DM_GETDEFID, OnGetDefID)
….
END_MESSAGE_MAP()
{
return MAKELONG(0,DC_HASDEFID);
}
BOOL DialogName::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)
{