Как сделать, чтобы диалог не закрывался при нажатии пользователем 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() и, соответственно диалог не будет закрываться.