Implementar uma janela com CWindowImpl
Para implementar uma janela, derive uma classe de CWindowImpl
. Em sua classe derivada, declare um mapa de mensagens e as funções do manipulador de mensagens. Agora você pode usar sua classe de três maneiras diferentes:
Criar uma janela com base em uma nova classe do Windows
CWindowImpl
contém a macro DECLARE_WND_CLASS para declarar informações de classe do Windows. Essa macro implementa a função GetWndClassInfo
, que usa CWndClassInfo para definir as informações de uma nova classe do Windows. Quando CWindowImpl::Create
é chamada, essa classe do Windows é registrada e uma nova janela é criada.
Observação
CWindowImpl
passa NULL para a macro DECLARE_WND_CLASS
, o que significa que a ATL gerará um nome de classe do Windows. Para especificar seu próprio nome, passe uma cadeia de caracteres para DECLARE_WND_CLASS em sua classe derivada de CWindowImpl
.
Exemplo: implementar uma janela
Veja abaixo um exemplo de uma classe que implementa uma janela com base 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 chame o método Create
.
Observação
Para substituir as informações de classe padrão do Windows, implemente o método GetWndClassInfo
em sua classe derivada definindo os membros CWndClassInfo
com os valores apropriados.
Criar superclasse em uma classe existente do Windows
A macro DECLARE_WND_SUPERCLASS permite criar uma janela que efetue superclasse de uma classe do Windows existente. Especifique essa macro na classe derivada de CWindowImpl
. Como qualquer outra janela da ATL, as mensagens são tratadas por um mapa de mensagens.
Quando você usar DECLARE_WND_SUPERCLASS, uma nova classe do Windows será registrada. Essa nova classe será a mesma que a classe existente especificada, mas substituirá o procedimento da janela por CWindowImpl::WindowProc
(ou pela função que substitui esse método).
Exemplo: criar superclasse da classe Editar
Veja abaixo um exemplo de uma classe que efetua superclasse da classe de edição padrã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 Editar com superclasse, crie uma instância de CMyEdit
e chame o método Create
.
Criar subclasse em uma janela existente
Para criar subclasse de uma janela existente, derive uma classe de CWindowImpl
e declare um mapa de mensagens, como nos dois casos anteriores. No entanto, observe que você não especifica nenhuma informação de classe do Windows, pois criará subclasse de uma janela já existente.
Em vez de chamar Create
, chame SubclassWindow
e passe o identificador para a janela existente da qual você deseja criar subclasse. Depois que a janela tiver a subclasse criada, ela usará CWindowImpl::WindowProc
(ou sua função que substitui esse método) para direcionar mensagens para o mapa da mensagem. Para desanexar uma janela com subclasse do objeto, chame UnsubclassWindow
. Em seguida, o procedimento de janela original da janela será restaurado.