Hola,
Por defecto un diálogo siempre resonde a dos pulsaciones, el ENTER y el ESC, enviando los mensajes IDOK y IDCANCEL respectivamente. Las funciones que manejan por defecto estos mensajes, OnOk() y OnCancel() respectivamente, hacen que el diálogo se cierre. Para evitarlo la mejor forma que he conseguido es sobreescribir esas funciones en tu clase derivada de CDialog y quitar las llamadas a la clase base. Puedes dejar esas funciones vacias o especificar el código que quieres que se ejecute al pulsar intro o escape, así:
en MiClaseDlg.h:
class CMiClaseDlg : public CDialog
{
...
virtual void OnCancel();
virtual void OnOK();
{
en MiClaseDlg.cpp:
void CMiClaseDlg::OnCancel()
{
}
void CMiClaseDlg::OnOK()
{
}
Lo de pulsar la tecla suprimir no lo he hecho nunca, ¿has mirado el mensaje LVN_KEYDOWN de la lista?
Lo de asignar variables al control de tipo valor o control, como lo veas más cómodo. Si vas a utilizar solamente el valor retornado por el control, igual es más cómodo utilizar una tipo valor, aunque recuerda que siempre necesitarás llamar a UpdateData(bool) para actualizar el valor en uno u otro sentido.
Si vas a hacer más cosas con el control, como ocultarlo y mostrarlo, cambiarle de tamaño o posición en tiempo de ejecución, etc, entonces es mejor usar una variable de tipo control y manejarlo con ella. Si vas a hacer todas estas cosas y no tienes una variable de tipo control, necesitarás llamar a GetDlgItem(int nID) para obtener un puntero al control cada vez.
un saludo