Partilhar via


Implementação de uma janela com CWindowImpl

Para implementar uma janela, derivar uma classe de CWindowImpl. Em sua classe derivada, declare um MAP da mensagem e as funções do manipulador de mensagens.Agora você pode usar a classe de três maneiras diferentes:

  • Criar uma janela baseada em uma nova classe do Windows

  • Superclasse uma classe existente do Windows

  • Subclasse de uma janela existente

Criando uma janela com base em uma nova classe do Windows

CWindowImpl contém o DECLARE_WND_CLASS macro declarar informações da classe.Essa macro implementa o GetWndClassInfo função, que usa CWndClassInfo para definir as informações de uma nova classe do Windows.Quando CWindowImpl::Create é chamado, esta Windows classe está registrado e uma nova janela é criada.

Observação:

CWindowImpl passagens NULO to the DECLARE_WND_CLASS macro significa que ATL irá gerar um nome de classe do Windows. Para especificar seu próprio nome, passe uma seqüência de caracteres para DECLARE_WND_CLASS no seu CWindowImpl-classe derivada.

Exemplo

A seguir é um exemplo de uma classe que implementa uma janela baseada em uma nova classe do 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 criar uma janela, crie uma instância de CMyWindow e, em seguida, telefonar o Criar método.

Observação:

Para substituir as informações de classe do Windows padrão, implemente o GetWndClassInfo método na sua classe derivada, definindo o CWndClassInfo membros com valores apropriados.

A seguir é um exemplo de uma classe que superclasses edição padrão classe:

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 criar a janela edição superclassificada, crie uma instância de CMyEdit e, em seguida, chamamos o Criar método.

Superclassing uma classe existente do Windows

The DECLARE_WND_SUPERCLASS macro permite que você crie uma janela que superclasses um Windows classe.Especificar essa macro no seu CWindowImpl-classe derivada. Como qualquer Outros janela ATL, as mensagens são tratadas por um MAP da mensagem.

Quando você usa DECLARE_WND_SUPERCLASS, uma nova classe do Windows será registrada. Essa nova classe será o mesmo que a classe existente que você especificar, mas substituirá o procedimento de janela por CWindowImpl::WindowProc (ou com a função que substitui esse método).

Subclassificação uma janela existente

Criar subclasse de uma janela existente, derivar uma classe de CWindowImpl e declarar um MAP da mensagem, sistema autônomo nos dois casos anteriores. Observe, entretanto, não especificar nenhuma informação de classe do Windows, desde que você irá subclasse uma janela já existente.

Em vez de chamar Criar, telefonar SubclassWindow e passá-lo a alça para a janela existente para a subclasse. Depois que a janela é uma subclasse, ele usará CWindowImpl::WindowProc (ou sua função substitui esse método) para direcionar mensagens ao MAP da mensagem. Para desconectar-se uma janela em que foi feito subclassing a partir de seu objeto, telefonar UnsubclassWindow. Procedimento de janela original da janela, em seguida, será restaurado.

Consulte também

Referência

Implementando uma janela