Compartir a través de


Implementación de una ventana con CWindowImpl

Para implementar una ventana, derive una clase desde CWindowImpl. En la clase derivada, declare un mapa de mensajes y las funciones del controlador de mensajes. Ahora puede usar la clase de tres formas diferentes:

Creación de una ventana basada en una nueva clase Windows

CWindowImpl contiene la macro DECLARE_WND_CLASS para declarar información de la clase Windows. Esta macro implementa la función GetWndClassInfo, que usa CWndClassInfo para definir la información de una nueva clase Windows. Cuando se llama a CWindowImpl::Create, se registra esta clase Windows y se crea una nueva ventana.

Nota:

CWindowImpl pasa null a la macro DECLARE_WND_CLASS, lo que significa que ATL generará un nombre de clase Windows. Para especificar su propio nombre, pase una cadena a DECLARE_WND_CLASS en la clase derivada de CWindowImpl.

Ejemplo: Implementación de una ventana

Aquí se muestra un ejemplo de una clase que implementa una ventana basada en una nueva clase Windows:

class CMyCustomWnd : public CWindowImpl<CMyCustomWnd>
{
public:
   // Optionally specify name of the new Windows class
   DECLARE_WND_CLASS(_T("MyName")) 
              // If this macro is not specified in your
              // class, ATL will generate a class name

   BEGIN_MSG_MAP(CMyCustomWnd)
      MESSAGE_HANDLER(WM_PAINT, OnPaint)
   END_MSG_MAP()

   LRESULT OnPaint(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      // Do some painting code
      return 0;
   }

};

Para crear una ventana, cree una instancia de CMyWindow y, después, llame al método Create.

Nota:

Para invalidar la información de clase Windows predeterminada, implemente el método GetWndClassInfo en la clase derivada estableciendo los miembros CWndClassInfo en los valores adecuados.

Superclasificación de una clase Windows existente

La macro DECLARE_WND_SUPERCLASS permite crear una ventana que superclasifica una clase Windows existente. Especifique esta macro en la clase derivada de CWindowImpl. Al igual que cualquier otra ventana ATL, un mapa de mensajes controla los mensajes.

Al usar DECLARE_WND_SUPERCLASS, se registrará una nueva clase Windows. Esta nueva clase será la misma que la clase existente que especifique, pero reemplazará el procedimiento de ventana por CWindowImpl::WindowProc (o por la función que invalida este método).

Ejemplo: Superclasificación de la clase Edit

Aquí se muestra un ejemplo de una clase que superclasifica la clase Edit estándar:

class CMyEdit : public CWindowImpl<CMyEdit>
{
public:
   // "Edit" is the name of the standard Windows class.
   // "MyEdit" is the name of the new Windows class
   // that will be based on the Edit class.
   DECLARE_WND_SUPERCLASS(_T("MyEdit"), _T("Edit"))

   BEGIN_MSG_MAP(CMyEdit)
      MESSAGE_HANDLER(WM_CHAR, OnChar)
   END_MSG_MAP()

   LRESULT OnChar(UINT /*nMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      // Do some character handling code
      return 0;
   }
};

Para crear la ventana Edit superclasificada, cree una instancia de CMyEdit y, después, llame al método Create.

Subclasificación de una ventana existente

Para subclasificar una ventana existente, derive una clase de CWindowImpl y declare una asignación de mensajes, como en los dos casos anteriores. Pero tenga en cuenta que no especifica ninguna información de clase Windows, ya que subclasificará una ventana ya existente.

En lugar de llamar a Create, llame a SubclassWindow y pásele el manipulador a la ventana existente que desea subclasificar. Una vez que la ventana está subclasificada, usará CWindowImpl::WindowProc (o la función que invalida este método) para dirigir los mensajes al mapa de mensajes. Para desasociar una ventana con subclases del objeto, llame a UnsubclassWindow. Entonces, se restaurará el procedimiento de ventana original.

Consulte también

Implementar una ventana