Implementar una ventana con CWindowImpl

Para implementar una ventana, derive una clase de CWindowImpl.En la clase derivada, declare un mapa de mensajes y el controlador de mensajes funciona.Ahora puede utilizar la clase de tres maneras diferentes:

  • Cree una ventana basada en una clase de Windows

  • Superclase una clase existente de Windows

  • Cree subclases una ventana existente

Crear una ventana basada en una nueva clase Windows

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

[!NOTA]

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

Ejemplo

A continuación se muestra un ejemplo de una clase que implementa una ventana basada en una clase de 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 llame al método de Create .

[!NOTA]

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

A continuación se muestra un ejemplo de una clase que utiliza la clase estándar de edición:

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 creada superclase de edición, cree una instancia de CMyEdit y llame al método de Create .

Crear utiliza una clase existente Windows

La macro de DECLARE_WND_SUPERCLASS permite crear una ventana que utiliza una clase existente de Windows.Especifique esta macro en la CWindowImpl- clase derivada.Como cualquier otra ventana ATL, los mensajes son controlados por un mapa de mensajes.

Cuando se utiliza DECLARE_WND_SUPERCLASS, una clase de Windows se registrada.Esta nueva clase será igual que la clase existente especifica, pero reemplazar el procedimiento de ventana con CWindowImpl::WindowProc (o con la función que invalida este método).

Crear subclases de una ventana existente

Para crear subclases de una ventana existente, derive una clase de CWindowImpl y declarar un mapa de mensajes, como en los dos casos anteriores.Observe, sin embargo, que no especifica ninguna información de clase de Windows, ya que creará subclases una ventana ya existente.

En lugar de llamar a Create, llame a SubclassWindow y pase el identificador de la ventana existente que desea crear subclases.Una vez que la ventana tiene subclases, utilizará CWindowImpl::WindowProc (o la función que invalida este método) para enviar mensajes al mapa de mensajes.Para desasociar una ventana derivado del objeto, llame a UnsubclassWindow.El procedimiento de ventana original de la ventana se restaurado.

Vea también

Referencia

Implementar una ventana