Partilhar via


Classe CWindowImpl

Essa classe fornece métodos para criar uma janela ou colocá-la em subclasse.

Importante

Essa classe e os respectivos membros não podem ser usados em aplicativos executados no Windows Runtime.

Sintaxe

template <class T, class TBase = CWindow, class TWinTraits = CControlWinTraits>
class ATL_NO_VTABLE CWindowImpl : public CWindowImplBaseT<TBase, TWinTraits>

Parâmetros

T
Defina uma nova classe derivada de CWindowImpl.

TBase
A classe base da sua classe. A classe base padrão é CWindow.

TWinTraits
Uma classe de características que define estilos para a janela. O padrão é CControlWinTraits.

Membros

Métodos públicos

Nome Descrição
CWindowImpl::Create Cria uma janela.

Métodos CWindowImplBaseT

Nome Descrição
DefWindowProc Fornece processamento de mensagem padrão.
GetCurrentMessage Retorna a mensagem atual.
GetWindowProc Retorna o procedimento da janela atual.
OnFinalMessage Chamado após a última mensagem ser recebida, normalmente é WM_NCDESTROY.
SubclassWindow Coloca uma janela em subclasse.
UnsubclassWindow Restaura uma janela que foi colocada em subclasse.

Métodos estáticos

Nome Descrição
GetWndClassInfo Retorna uma instância estática do CWndClassInfo, que gerencia as informações da classe de janela.
WindowProc Processa mensagens enviadas para a janela.

Membros de dados

Nome Descrição
m_pfnSuperWindowProc Aponta para o procedimento de janela original da classe de janela.

Comentários

É possível usar CWindowImpl para criar uma nova janela ou uma subclasse de uma janela existente. O procedimento de janela CWindowImpl usa um mapa de mensagem no objeto contentor para direcionar mensagens para os manipuladores apropriados.

CWindowImpl::Create cria uma janela com base nas informações da classe de janela gerenciadas por CWndClassInfo. CWindowImpl contém a macro DECLARE_WND_CLASS, o que significa que CWndClassInfo registra uma nova classe de janela. Se você quiser transformar uma classe janela existente em superclasse, derive sua classe de CWindowImpl e inclua a macro DECLARE_WND_SUPERCLASS. Nesse caso, o método CWndClassInfo primeiro registra uma classe de janela baseada em uma classe existente, mas usa CWindowImpl::WindowProc. Por exemplo:

class ATL_NO_VTABLE CMyWindow :
   OtherInheritedClasses
   public CComControl<CMyWindow>
          // CComControl derives from CWindowImpl
{
public:
   // 1. The NULL parameter means ATL will generate a
   //    name for the superclass
   // 2. The "EDIT" parameter means the superclass is
   //    based on the standard Windows Edit box
   DECLARE_WND_SUPERCLASS(NULL, _T("EDIT"))

   // Remainder of class declaration omitted

Observação

Como CWndClassInfo gerencia as informações de apenas uma classe de janela, cada janela criada por meio de uma instância de CWindowImpl é baseada na mesma classe de janela.

CWindowImpl também dá suporte à subclasse de janela. O método SubclassWindow anexa uma janela existente ao objeto CWindowImpl e altera o procedimento de janela para CWindowImpl::WindowProc. Cada instância de CWindowImpl pode colocar uma janela diferente em uma subclasse.

Observação

Para qualquer objeto CWindowImpl determinado, chame Create ou SubclassWindow. Não invoque ambos os métodos no mesmo objeto.

Além de CWindowImpl, a ATL fornece CContainedWindow para criar uma janela contida em outro objeto.

O destruidor da classe base (~ CWindowImplRoot) garante que a janela tenha sumido antes de o objeto ser destruído.

CWindowImpl deriva de CWindowImplBaseT, que deriva de CWindowImplRoot, que deriva de TBase e CMessageMap.

Para obter mais informações sobre Consulte
Criar controles Tutorial da ATL
Usar janelas na ATL Classes de janela da ATL
Assistente de Projeto da ATL Criando um projeto ATL

Hierarquia de herança

CMessageMap

TBase

CWindowImplRoot

CWindowImplBaseT

CWindowImpl

Requisitos

Cabeçalho: atlwin.h

CWindowImpl::Create

Cria uma janela com base em uma nova classe de janela.

HWND Create(
    HWND hWndParent,
    _U_RECT rect = NULL,
    LPCTSTR szWindowName = NULL,
    DWORD dwStyle = 0,
    DWORD dwExStyle = 0,
    _U_MENUorID MenuOrID = 0U,
    LPVOID lpCreateParam = NULL);

Parâmetros

hWndParent
[in] O identificador para a janela proprietária ou pai.

rect
[in] Uma estrutura RECT que especifica a posição da janela. O RECT pode ser passado por ponteiro ou por referência.

szWindowName
[in] Especifica o nome da janela. O valor padrão é NULL.

dwStyle
[in] O estilo da janela. Esse valor é combinado com o estilo fornecido pela classe de características da janela. O valor padrão fornece à classe de características controle total sobre o estilo. Para obter uma lista de valores possíveis, consulte CreateWindow no SDK do Windows.

dwExStyle
[in] O estilo de janela estendida. Esse valor é combinado com o estilo fornecido pela classe de características da janela. O valor padrão fornece à classe de características controle total sobre o estilo. Para obter uma lista de valores possíveis, confira CreateWindowEx no SDK do Windows.

MenuOrID
[in] Para uma janela filho, o identificador da janela. Para uma janela de nível superior, um identificador de menu para a janela. O valor padrão é 0U.

lpCreateParam
[in] Um ponteiro para dados de criação de janela. Para ver uma descrição completa, confira a descrição do parâmetro final para CreateWindowEx.

Valor de retorno

Se bem-sucedido, o identificador para a janela recém-criada. Caso contrário, NULL.

Comentários

Create primeiro registrará a classe de janela se ela ainda não tiver sido registrada. A janela recém-criada é anexada automaticamente ao objeto CWindowImpl.

Observação

Não chame Create se você já tiver chamado SubclassWindow.

Para usar uma classe de janela com base em uma classe janela existente, derive sua classe de CWindowImpl e inclua a macro DECLARE_WND_SUPERCLASS. O procedimento de janela da classe de janela existente é salvo em m_pfnSuperWindowProc. Para obter mais informações, confira a visão geral de CWindowImpl.

Observação

Se 0 for usado como o valor do parâmetro MenuOrID, ele deverá ser especificado como 0U (o valor padrão) para evitar um erro do compilador.

CWindowImpl::DefWindowProc

Chamado por WindowProc para processar mensagens não identificadas pelo mapa de mensagens.

LRESULT DefWindowProc(
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam);

LRESULT DefWindowProc();

Parâmetros

uMsg
[in] A mensagem enviada para a janela.

wParam
[in] Informações adicionais específicas de mensagem.

lParam
[in] Informações adicionais específicas de mensagem.

Valor de retorno

O resultado do processamento da mensagem.

Comentários

Por padrão, DefWindowProc chama a função Win32 CallWindowProc para enviar as informações da mensagem para o procedimento de janela especificado em m_pfnSuperWindowProc.

A função sem parâmetros recupera automaticamente os parâmetros necessários da mensagem atual.

CWindowImpl::GetCurrentMessage

A mensagem atual, empacotada na estrutura MSG.

const MSG* GetCurrentMessage();

Valor de retorno

A mensagem atual.

CWindowImpl::GetWindowProc

Retorna WindowProc, o procedimento de janela atual.

virtual WNDPROC GetWindowProc();

Valor de retorno

O procedimento de janela atual.

Comentários

Substitua esse método para substituir o procedimento de janela pelo seu.

CWindowImpl::GetWndClassInfo

Chamado por Create para acessar as informações da classe de janela.

static CWndClassInfo& GetWndClassInfo();

Valor de retorno

Uma instância estática de CWndClassInfo.

Comentários

Por padrão, CWindowImpl obtém esse método por meio da macro DECLARE_WND_CLASS, que especifica uma nova classe de janela.

Para transformar uma classe janela existente em superclasse, derive sua classe de CWindowImpl e inclua a macro DECLARE_WND_SUPERCLASS para substituir GetWndClassInfo. Para obter mais informações, confira a visão geral de CWindowImpl.

Além de usar as macros DECLARE_WND_CLASS e DECLARE_WND_SUPERCLASS, você pode substituir GetWndClassInfo com uma implementação própria.

CWindowImpl::m_pfnSuperWindowProc

Dependendo da janela, aponta para um dos procedimentos de janela a seguir.

WNDPROC m_pfnSuperWindowProc;

Comentários

Tipo de janela Procedimento de janela
Uma janela baseada em uma nova classe de janela, especificada por meio da macro DECLARE_WND_CLASS. A função Win32 DefWindowProc.
Uma janela baseada em uma classe de janela que modifica uma classe existente, especificada por meio da macro DECLARE_WND_SUPERCLASS. O procedimento de janela da classe de janela existente.
Uma janela colocada em subclasse. O procedimento de janela original da janela em subclasse.

CWindowImpl::DefWindowProc envia informações de mensagem para o procedimento de janela salvo em m_pfnSuperWindowProc.

CWindowImpl::OnFinalMessage

Chamado após receber a última mensagem, normalmente WM_NCDESTROY.

virtual void OnFinalMessage(HWND hWnd);

Parâmetros

hWnd
[in] Um identificador para a janela que está sendo destruída.

Comentários

A implementação padrão de OnFinalMessage não faz nada, mas você pode substituir essa função para lidar com a limpeza antes de destruir uma janela. Observe que, se você quiser excluir automaticamente o objeto após a destruição da janela, poderá chamar delete this; nesta função.

CWindowImpl::SubclassWindow

Coloca em subclasse a janela identificada por hWnd e a anexa ao objeto CWindowImpl.

BOOL SubclassWindow(HWND hWnd);

Parâmetros

hWnd
[in] O identificador da janela sendo colocada em subclasse.

Valor de retorno

TRUE se a janela for colocada em subclasse com êxito; caso contrário, FALSE.

Comentários

A janela colocada em subclasse agora usa CWindowImpl::WindowProc. O procedimento de janela original é salvo em m_pfnSuperWindowProc.

Observação

Não chame SubclassWindow se você já tiver chamado Criar.

CWindowImpl::UnsubclassWindow

Desanexa a janela colocada em subclasse do objeto CWindowImpl e restaura o procedimento de janela original, salvo em m_pfnSuperWindowProc.

HWND UnsubclassWindow();

Valor de retorno

O identificador para a janela colocada em subclasse anteriormente.

CWindowImpl::WindowProc

Essa função estática implementa o procedimento da janela.

static LRESULT CALLBACK WindowProc(
    HWND hWnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam);

Parâmetros

hWnd
[in] O identificador para a janela.

uMsg
[in] A mensagem enviada para a janela.

wParam
[in] Informações adicionais específicas de mensagem.

lParam
[in] Informações adicionais específicas de mensagem.

Valor de retorno

O resultado do processamento da mensagem.

Comentários

WindowProc usa o mapa de mensagem padrão declarado com BEGIN_MSG_MAP para direcionar mensagens para os manipuladores apropriados. Se necessário, WindowProc chama DefWindowProc para processamento adicional de mensagens. Se a mensagem final não for manipulada, WindowProc faz o seguinte:

  • Executa a remoção da subclasse se a janela foi retirada da subclasse.

  • Limpa o m_hWnd.

  • Chama OnFinalMessage antes que a janela seja destruída.

Você pode substituir WindowProc para fornecer um mecanismo diferente para lidar com mensagens.

Confira também

BEGIN_MSG_MAP
Classe CComControl
Visão geral da aula