Compartir por


Controladores para mensajes estándar de Windows

Los controladores predeterminados para los mensajes estándar de Windows (WM_) están predefinidos en la clase CWnd. La biblioteca de clases basa los nombres de estos controladores en el nombre del mensaje. Por ejemplo, el controlador del mensaje de WM_PAINT se declara en CWnd como:

afx_msg void OnPaint();

La palabra clave afx_msg sugiere el efecto de la palabra clave virtual de C++ al distinguir los controladores de otras funciones miembro CWnd. Tenga en cuenta, sin embargo, que estas funciones no son realmente virtuales; en su lugar se implementan a través de asignaciones de mensajes. Las asignaciones de mensajes dependen únicamente de las macros de preprocesador estándar, no de ninguna extensión al lenguaje C++. La palabra clave afx_msg se resuelve en espacios en blanco después del preprocesamiento.

Para invalidar un controlador definido en una clase base, simplemente defina una función con el mismo prototipo en la clase derivada y cree una entrada en la asignación de mensajes para el controlador. El controlador "invalida" cualquier controlador con el mismo nombre en cualquiera de las clases base de la clase.

En algunos casos, el controlador debe llamar al controlador invalidado en la clase base para que las clases base y Windows puedan operar con el mensaje. El lugar en el que se llama al controlador de clase base en la invalidación depende de las circunstancias. A veces, debe llamar al controlador de clase base primero y, otras veces, al final. A veces se llama condicionalmente al controlador de clase base si decide no controlar el mensaje usted mismo. A veces, debe llamar al controlador de clase base y, a continuación, ejecutar condicionalmente su propio código de controlador, según el valor o el estado devuelto por el controlador de clase base.

Precaución

No es seguro modificar los argumentos pasados a un controlador si piensa pasarlos a un controlador de clase base. Por ejemplo, es posible que tenga la tentación de modificar el argumento nChar del controlador OnChar (para convertir a mayúsculas, por ejemplo). Este comportamiento es bastante oscuro, pero si necesita lograr este efecto, use la función miembro CWnd SendMessage en su lugar.

Cómo se determina la manera adecuada de invalidar un mensaje determinado. Cuando el Asistente para clases escribe el esqueleto de la función de controlador para un mensaje determinado (un controlador OnCreate para WM_CREATE, por ejemplo), se esboza en la forma de la función miembro invalidada recomendada. En el ejemplo siguiente se recomienda que el controlador llame primero al controlador de clase base y que proceda solo con la condición de que no devuelva -1.

int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
   if (CFormView::OnCreate(lpCreateStruct) == -1)
      return -1;

   // TODO:  Add your specialized creation code here

   return 0;
}

Por convención, los nombres de estos controladores comienzan por el prefijo "On". Algunos de estos controladores no toman argumentos, mientras que otros toman varios. Algunos también tienen un tipo de valor devuelto distinto de void. Los controladores predeterminados de todos los mensajes de WM_ se documentan en la Referencia de MFC como funciones miembro de la clase CWnd, cuyos nombres comienzan por "On". Las declaraciones de funciones miembro de CWnd tienen el prefijo afx_msg.

Consulte también

Declaración de funciones del controlador de mensajes