Implementando uma janela com CWindowImpl
Para implementar uma janela, derive uma classe de CWindowImpl.Em sua classe derivada, declare um mapa de mensagem e funções do manipulador de mensagem.Agora você pode usar a classe em três diferentes maneiras:
Crie uma janela com base em uma classe do windows
Superclass uma classe existente do windows
Subclasse uma janela existente
Criando uma janela com base em uma classe do windows
CWindowImpl contém a macro de DECLARE_WND_CLASS para declarar informações de classe do windows.Este macro implementa a função de GetWndClassInfo , que usa CWndClassInfo para definir informações de uma classe do windows.Quando CWindowImpl::Create é chamado, essa classe do windows é registrada e uma nova janela é criada.
Observação |
---|
CWindowImpl passa NULO a macro de DECLARE_WND_CLASS , que significa que ATL gerará um nome de classe do windows.Para especificar seu próprio nome, passe uma cadeia de caracteres a DECLARE_WND_CLASS em seu CWindowImpl- classe derivada. |
Exemplo
A seguir está um exemplo de uma classe que implementa uma janela com base em uma 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 então chame o método de Criar .
Observação |
---|
Para substituir as janelas de opção classe informações, implementam o método de GetWndClassInfo em sua classe derivada definindo os membros de CWndClassInfo para valores apropriados. |
A seguir está um exemplo de uma classe que superclasses a classe padrão de edição:
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 superclassed de edição, crie uma instância de CMyEdit e então chame o método de Criar .
Superclassing uma classe existente do windows
A macro de DECLARE_WND_SUPERCLASS permite que você crie uma janela que os superclasses forms existentes classifiquem.Especificar este macro em seu CWindowImpl- classe derivada.Como qualquer outra janela de ATL, as mensagens são tratadas por um mapa de mensagem.
Quando você usa DECLARE_WND_SUPERCLASS, uma classe do windows estará registrado.Essa nova classe será a mesma como a classe existente você especifica, mas substituirá o procedimento de janela com CWindowImpl::WindowProc (ou com sua função que substitui esse método).
Subclassing uma janela existente
Subclasse para uma janela existente, uma classe derivada de CWindowImpl e declara um mapa de mensagem, como os dois casos anteriores.Observe, entretanto, que você não especificar quaisquer informações da classe do windows, desde que você subclasse uma janela já existente.
Em vez de chamar Criar, chame SubclassWindow e passe a alça a janela existente que você deseja fazer subclassing.Uma vez que a janela tem sido derivado, usará CWindowImpl::WindowProc (ou sua função que substitui esse método) para direcionar mensagens ao mapa de mensagem.Para desanexar uma janela tem sido derivado do objeto, chame UnsubclassWindow.O procedimento de janela original da janela será restaurado em.