Как сделать, чтобы диалог не закрывался при нажатии пользователем Enter или Esc

Для начала разберёмся, почему диалог закрывается, даже если убрать кнопки OK и Cancel. CDialog имеет две специальных виртуальных функции, OnOK() и OnCancel(), которые вызываются когда пользователь нажимает клавиши Enter или Esc соответственно. CDialog содержит функцию EndDialog(), которая собственно и закрывает диалог. Так как она относится к функциям специального назначения, то она не присуствует в диалоговой секции BEGIN_MESSAGE_MAP/END_MESSAGE_MAP, и должна быть переопределена по-другому, в отличие от обычных обработчиков нажатия на кнопки.

Если у Вас есть кнопки с идентификаторами IDOK и IDCANCEL, то можно воспользоваться Визардом (ClassWizard) для добавления обработчиков BN_CLICKED для этих кнопок, и они будут делать необходимые действия для OnOK() и OnCancel(). Если у Вас нет кнопок с этими ID, то можно вручную добавить эти виртуальные функции. В заголовочном файле диалогового класса:

class CMyDialog : public CDialog
{
// ...

// Generated message map functions
//{{AFX_MSG(CMyDialog)
virtual void OnOK();
virtual void OnCancel();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

А затем в соответствующем .CPP файле:

void CMyDialog::OnOK() 
{
}

void CMyDialog::OnCancel()
{
}

Теперь обработчики не будут вызывать EndDialog() и, соответственно диалог не будет закрываться.

 
« Предыдущая статья   Следующая статья »