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
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.